tokentracker-cli 1.3.4 → 1.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +5 -5
- package/README.ja.md +3 -3
- package/README.ko.md +3 -3
- package/README.md +6 -5
- package/README.zh-CN.md +3 -3
- package/dashboard/dist/assets/{AchievementBadge-CKjtQp-U.js → AchievementBadge-Dazs3pEa.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-DpOXrabE.js → AchievementsPage-LWnxZvmw.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-DiXyIoa0.js → AchievementsSection-BLqczmU9.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-CILTTkPF.js → BadgeDetailModal-B_n4aj2S.js} +1 -1
- package/dashboard/dist/assets/{BotAnimated-CrBHWiRi.js → BotAnimated-KDWI_YcZ.js} +1 -1
- package/dashboard/dist/assets/{Card-DUItW3xI.js → Card-BYoxd4OC.js} +1 -1
- package/dashboard/dist/assets/{CloudCheckoutPage-C_t_PDlG.js → CloudCheckoutPage-BR2_B03P.js} +1 -1
- package/dashboard/dist/assets/{CloudPage-pvJUrhya.js → CloudPage-DL5RkJKK.js} +1 -1
- package/dashboard/dist/assets/{CloudUsageExport-DQbDwiyk.js → CloudUsageExport-C_DqZKo1.js} +1 -1
- package/dashboard/dist/assets/{CommandPalette-BvHilrbV.js → CommandPalette-DkCaIQI4.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-CizxEYv-.js → CommunityStatsModal-pX9OePi4.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-h9nISVy7.js → ConfirmModal-tkgZwz4u.js} +1 -1
- package/dashboard/dist/assets/{Controls-BjdIonTX.js → Controls-MTUhGWy8.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-Bxryr4qp.js → DashboardPage-SOx-A7lH.js} +1 -1
- package/dashboard/dist/assets/{DateRangePopover-DpKh-0l8.js → DateRangePopover-B-BMOm3O.js} +1 -1
- package/dashboard/dist/assets/{DevicePage-DUJR9hJC.js → DevicePage-DSK9lm7v.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-BmVAmN-o.js → DialogClose-uVUNu4rg.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-DBqGGWNj.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-BsaIbN8k.js → DialogTitle-B-VifiA3.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-BpSt2P_W.js → FadeIn-B6lrj4uo.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-Cc_VHB0R.js → HeaderGithubStar-Cx5zOhXa.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-WFd21iP9.js → HoverTooltip-DY1ENf69.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-C_mUPSRB.js → IpCheckPage-D6TEq64d.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-DVR8ClZO.js → LandingPage-OdZUfq--.js} +2 -2
- package/dashboard/dist/assets/LeaderboardPage-DCK5xcAt.js +2 -0
- package/dashboard/dist/assets/{LeaderboardProBadge-BjX4EFl2.js → LeaderboardProBadge-CBXJ1u_m.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardProfileModal-vbPMNn7W.js → LeaderboardProfileModal-Ccdzb7QK.js} +4 -4
- package/dashboard/dist/assets/{LeaderboardProfilePage-CqClmuA-.js → LeaderboardProfilePage-CFXlZ0fL.js} +1 -1
- package/dashboard/dist/assets/LimitsPage-5krjm-g9.js +9 -0
- package/dashboard/dist/assets/{LocalOnlyNotice-B6nDke_u.js → LocalOnlyNotice-Rk1B8PaZ.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-C28QVjd7.js → LoginCard-DTTIm8vk.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-Bx1btNhH.js → LoginModal-BNcDdjfr.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-DVOGNGYI.js → LoginPage-CQgXP7Ee.js} +1 -1
- package/dashboard/dist/assets/{PetPage-nOKryTde.js → PetPage-Cw_kAPRs.js} +1 -1
- package/dashboard/dist/assets/{PopoverPopup-Ch6NLnu6.js → PopoverPopup-NYiGE8A2.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-BRY2br-g.js → ProviderIcon-Bp7iFJ_m.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-ko1OQecQ.js → ResetPasswordPage-Cf9kAWDW.js} +1 -1
- package/dashboard/dist/assets/{Select-Q8mS3_od.js → Select-kIcvQFAo.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-C1id8GDj.js → SelectItemText-BpIsAg3b.js} +1 -1
- package/dashboard/dist/assets/{SelfHostPage-Dzb2bDiM.js → SelfHostPage-Ch2vvSwI.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-ewFwz29J.js → ServiceStatusPage-hoYBvGbu.js} +1 -1
- package/dashboard/dist/assets/SessionsPage-BzRB6q-Z.js +3 -0
- package/dashboard/dist/assets/SettingsPage-DRl2uX-i.js +2 -0
- package/dashboard/dist/assets/{SkillsPage-CcG77tqU.js → SkillsPage-CkqThTZL.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-D2HDrbQR.js → TokenGalaxy-eLG-UIZY.js} +1 -1
- package/dashboard/dist/assets/{TooltipPopup-C_bF2ZwO.js → TooltipPopup-bnMJyilQ.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-BcyoN5ns.js → TrendMonitor-X7-aGzIv.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-BirK0U_N.js → WidgetsPage-CGznIzrW.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-thsXBuw6.js → WrappedPage-p31-uUoF.js} +1 -1
- package/dashboard/dist/assets/{__vite-browser-external-Bq8nj-JV.js → __vite-browser-external-2g_4s3ot.js} +12 -12
- package/dashboard/dist/assets/__vite-browser-external-LpFw4zXh.css +1 -0
- package/dashboard/dist/assets/agent-logos-2TVT3fIE.js +1 -0
- package/dashboard/dist/assets/{arrow-left-c_NOSfoq.js → arrow-left-DL0hAp_7.js} +1 -1
- package/dashboard/dist/assets/{arrow-right-CP7drKCT.js → arrow-right-DFCpnV_9.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-DQ6QfCpo.js → arrow-up-right-DLvfE0Wu.js} +1 -1
- package/dashboard/dist/assets/{calendar-days-D_pxFQvT.js → calendar-days-B0aDoKSG.js} +1 -1
- package/dashboard/dist/assets/{check-HAS31kTT.js → check-C_cfrxiz.js} +1 -1
- package/dashboard/dist/assets/{chevron-down-BIMuk6oN.js → chevron-down-Ck8ml43e.js} +1 -1
- package/dashboard/dist/assets/{cloud-checkout-COmDwrUT.js → cloud-checkout-PYnwNfdH.js} +1 -1
- package/dashboard/dist/assets/{composite-kLwqpqEk.js → composite-INW-ELWX.js} +1 -1
- package/dashboard/dist/assets/{download-9RgsZIiH.js → download-B7uokeIo.js} +1 -1
- package/dashboard/dist/assets/{external-link-C_gYjHGF.js → external-link-CI3crg4K.js} +1 -1
- package/dashboard/dist/assets/{flame-BSsCvgT8.js → flame-DCzvFKV1.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-N22Wqv1X.js → format-tokens-CSTEYK2m.js} +1 -1
- package/dashboard/dist/assets/gift-dEHDFMc6.js +1 -0
- package/dashboard/dist/assets/{host-mode-JzrhHX7F.js → host-mode-r2SW9Mdv.js} +1 -1
- package/dashboard/dist/assets/{icons-pK99mIMv.js → icons-q-3zvEkh.js} +1 -1
- package/dashboard/dist/assets/{index-CmD84EJi.js → index-BV7qwUw4.js} +1 -1
- package/dashboard/dist/assets/{index-Dk43KNa6.js → index-BbrsgHf4.js} +1 -1
- package/dashboard/dist/assets/{index-BhviBroj.js → index-CyHYj9XI.js} +1 -1
- package/dashboard/dist/assets/{info-D-RLFnSK.js → info-BBdY9hV4.js} +1 -1
- package/dashboard/dist/assets/{link-2-BiKXW9mV.js → link-2-CLPePfXs.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-KVUaEKV2.js → loader-circle-ETrjzfmn.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-5NK8j3mT.js → modifiers.esm-DHqnp2ol.js} +1 -1
- package/dashboard/dist/assets/module-BNnaKM__.js +3 -0
- package/dashboard/dist/assets/{monitor-smartphone-u9yr-_Es.js → monitor-smartphone-D1kdzrdb.js} +1 -1
- package/dashboard/dist/assets/{play-D0MaDCOx.js → play-Cxp-ronD.js} +1 -1
- package/dashboard/dist/assets/{plus-DTJVtoAJ.js → plus-4n94VzDK.js} +1 -1
- package/dashboard/dist/assets/{provider-display-YhtG0I9Y.js → provider-display-CRlbeO7t.js} +1 -1
- package/dashboard/dist/assets/{react-gIVxucOB.js → react-DlHjGQFN.js} +1 -1
- package/dashboard/dist/assets/{safePolygon-C_sPnJ1L.js → safePolygon-CVZ27a2_.js} +1 -1
- package/dashboard/dist/assets/{search-DdQRwFYV.js → search-BDPr56_h.js} +1 -1
- package/dashboard/dist/assets/{server-M0rmbGWy.js → server-Bm7fHvVa.js} +1 -1
- package/dashboard/dist/assets/{shield-check-9-sqQKdD.js → shield-check-DtT8ACzI.js} +1 -1
- package/dashboard/dist/assets/{skills-api-B0qBWnuK.js → skills-api-Dc1-2qu6.js} +1 -1
- package/dashboard/dist/assets/{sortable.esm-iqbm7x5D.js → sortable.esm-B-qN-Xk2.js} +1 -1
- package/dashboard/dist/assets/{store-DstuWd4a.js → store-gHeBU8dQ.js} +1 -1
- package/dashboard/dist/assets/{terminal-Dz0MxHNG.js → terminal-D4VZbvhg.js} +1 -1
- package/dashboard/dist/assets/{trash-DBMFOFVz.js → trash-BZtLAFQy.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-CacbAcUR.js → use-community-stats-BdqndrbB.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-nBuQVZOR.js → use-latest-request-guard-DhGg1cDS.js} +1 -1
- package/dashboard/dist/assets/use-limits-display-prefs-D3HOcRFv.js +1 -0
- package/dashboard/dist/assets/{use-native-settings-EAqAFx2x.js → use-native-settings-BniKwA_n.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-DGLjjU6Q.js → use-ordered-list-b09H7EHq.js} +1 -1
- package/dashboard/dist/assets/{use-pet-settings-C5MzWHE7.js → use-pet-settings-CPZdlq_e.js} +2 -2
- package/dashboard/dist/assets/use-reduced-motion-D1gcKJUo.js +1 -0
- package/dashboard/dist/assets/{use-transform-C25eCuz_.js → use-transform-CIdxjmI8.js} +1 -1
- package/dashboard/dist/assets/use-usage-limits-eJlU65yY.js +1 -0
- package/dashboard/dist/assets/{useCurrency-t3PYQi1l.js → useCurrency-CM22CmAq.js} +1 -1
- package/dashboard/dist/assets/{usePositioner-C59mj6kG.js → usePositioner-B3l2ulTw.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-C0xQsBGf.js → useTokenFormat-D7nzgxKw.js} +1 -1
- package/dashboard/dist/assets/{zap-CyH0tvKM.js → zap-Daxct1WV.js} +1 -1
- package/dashboard/dist/index.html +14 -12
- package/dashboard/dist/ip-check.html +2 -2
- package/dashboard/dist/leaderboard.html +2 -2
- package/dashboard/dist/llms.txt +2 -2
- package/dashboard/dist/share.html +2 -2
- package/package.json +2 -2
- package/src/commands/init.js +43 -1
- package/src/commands/status.js +27 -0
- package/src/commands/sync.js +54 -4
- package/src/commands/uninstall.js +19 -0
- package/src/lib/claude-config.js +47 -15
- package/src/lib/codex-rollout-parser.js +11 -3
- package/src/lib/command-runner.js +15 -1
- package/src/lib/cursor-config.js +2 -1
- package/src/lib/gemini-config.js +3 -2
- package/src/lib/local-api.js +13 -3
- package/src/lib/notify-command.js +38 -0
- package/src/lib/openclaw-session-plugin.js +47 -14
- package/src/lib/passive-mode.js +12 -0
- package/src/lib/pricing/curated-overrides.json +42 -5
- package/src/lib/pricing/matcher.js +14 -5
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +150 -28
- package/src/lib/session-analytics.js +108 -9
- package/src/lib/usage-limits.js +183 -20
- package/src/lib/zcode-limits.js +218 -18
- package/src/lib/zcode-reset-credits.js +66 -0
- package/dashboard/dist/assets/DialogDescription-C0Cgq67g.js +0 -1
- package/dashboard/dist/assets/LeaderboardPage-D8ydzVpn.js +0 -2
- package/dashboard/dist/assets/LimitsPage-DaRggHge.js +0 -8
- package/dashboard/dist/assets/SessionsPage-C6Y8kbnM.js +0 -3
- package/dashboard/dist/assets/SettingsPage-nztCXEPs.js +0 -2
- package/dashboard/dist/assets/__vite-browser-external-BwmeEfv7.css +0 -1
- package/dashboard/dist/assets/agent-logos-CK6SzhI7.js +0 -1
- package/dashboard/dist/assets/module-WSx8viXK.js +0 -3
- package/dashboard/dist/assets/use-limits-display-prefs-fqg8hs6b.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-DK2oZ2uC.js +0 -1
- package/dashboard/dist/assets/use-usage-limits-BhqnEai3.js +0 -1
package/README.de.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
### Sieh genau, was du für KI ausgibst – über jedes CLI hinweg
|
|
8
8
|
|
|
9
|
-
Sammle automatisch Token-Zahlen von **
|
|
9
|
+
Sammle automatisch Token-Zahlen von **44 KI-Coding-Tools**, aggregiere sie lokal und sieh echte Kostentrends in einem schönen Dashboard. Kein Cloud-Konto, keine API-Keys, kein Setup – nur ein Befehl.
|
|
10
10
|
|
|
11
11
|
[](https://www.npmjs.com/package/tokentracker-cli)
|
|
12
12
|
[](https://www.npmjs.com/package/tokentracker-cli)
|
|
@@ -92,7 +92,7 @@ Aktualisieren mit `brew upgrade --cask xiufengsun/tokentracker/tokentracker`. De
|
|
|
92
92
|
|
|
93
93
|
## ✨ Features
|
|
94
94
|
|
|
95
|
-
- 🔌 **
|
|
95
|
+
- 🔌 **44 KI-Tools out of the box** — Claude Code, Codex CLI, AStudio, Cursor, Gemini CLI, Antigravity, Kiro, OpenCode, OpenClaw, Every Code, Hermes Agent, GitHub Copilot, Kimi Code, CodeBuddy, WorkBuddy, WorkBuddy AI, Grok Build, oh-my-pi, OmO, pi, Dots, Prime Agent, Craft Agents, Reasonix, Kilo CLI, Kilo Code, Roo Code, Zed Agent, Goose, Droid, Mimo Code, ZCode, Qoder, AnythingLLM Desktop, Claude Science, DeepSeek Harness, TRAE Work CN, LM Studio, Unsloth Studio, Devin CLI, Cline, MiniMax Code, Command Code, TRAE
|
|
96
96
|
- 🏠 **Local-First** — Läuft auf deinem Rechner. Parst Logs lokal, ohne Konto oder API-Keys.
|
|
97
97
|
- 🚀 **Zero Config** — Hooks installieren sich beim ersten Start automatisch. Von null zum Dashboard in 30 Sekunden.
|
|
98
98
|
- 📊 **Schönes Dashboard** — Nutzungstrends, Kostenaufschlüsselung nach Modell, GitHub-ähnliche Aktivitäts-Heatmap, Projektzuordnung
|
|
@@ -213,7 +213,7 @@ Aktualisieren mit `brew upgrade --cask xiufengsun/tokentracker/tokentracker`. De
|
|
|
213
213
|
| **TRAE Work CN** | ✅ Auto | **Erfordert eine ausdrückliche Zustimmung: `TOKENTRACKER_TRAE_CN_USAGE=1` setzen.** Das Lesen der Nutzung überträgt die lokal gespeicherte Anmeldeautorisierung an die interne API von TRAE, daher wird nichts gesendet, bevor du es aktivierst. Danach: liest bei vorhandener lokaler TRAE Work CN-Anmeldung während eines zulässigen Syncs außerhalb des Hintergrundbetriebs unter macOS die Session-Token-Nutzung der angemeldeten App; die interne API kann sich ändern |
|
|
214
214
|
|
|
215
215
|
> **Muss ich Plugins oder Hooks manuell installieren?** Nein. `tokentracker` (oder `tokentracker init`) erledigt alles beim ersten Start:
|
|
216
|
-
> - **Hook-basiert** (Claude Code, Codex, AStudio, Gemini, Every Code, CodeBuddy, WorkBuddy, Grok Build) — wir schreiben einen SessionEnd-Hook oder TOML-Notify-Eintrag in die Konfiguration des Tools.
|
|
216
|
+
> - **Hook-basiert** (Claude Code, Codex, AStudio, Gemini, Every Code, CodeBuddy, WorkBuddy, WorkBuddy AI, Grok Build) — wir schreiben einen SessionEnd-Hook oder TOML-Notify-Eintrag in die Konfiguration des Tools.
|
|
217
217
|
> - **Plugin-basiert** (OpenCode, OpenClaw) — das Plugin ist im npm-Paket enthalten (`~/.tokentracker/app/openclaw-plugin/`). Wir verlinken es per CLI (`openclaw plugins install --link …` + `enable`). Kein Download, kein Drag-and-Drop.
|
|
218
218
|
> - **Passive Reader** (Cursor, Kiro, Hermes, Kimi Code, Copilot, Grok Build, oh-my-pi, pi, Craft Agents, Reasonix, Kilo CLI, Kilo Code, Roo Code, Antigravity, Zed Agent, Goose, Droid, Mimo Code, ZCode, LM Studio, Unsloth Studio, AnythingLLM Desktop, Devin CLI, MiniMax Code, Claude Science, DeepSeek Harness, Cline) — wir installieren nichts in diesen Tools. Wir lesen nur Dateien, die sie bereits produzieren (SQLite-DB, JSONL, OTEL-Export, Session-Logs). Die Nutzung von Copilot App / CLI wird pro Anfrage aus `~/.copilot/session-store.db` gelesen; `data.db` liefert einmalig die Legacy-Migrationsbasis und bleibt nach der kanonischen Übernahme des Stores schreibgeschützt im Beobachtungsmodus, während Chat-Erweiterung und ältere CLI-Versionen weiterhin OTEL verwenden. TokenTracker koordiniert diese Quellen, damit überlappende Anfragen nur einmal gezählt werden. Gemischte App/CLI-Historie vor der Übernahme bleibt als `github-copilot-legacy`-Aggregat erhalten, statt einem geratenen Anfrage-Modell zugeordnet zu werden.
|
|
219
219
|
>
|
|
@@ -231,7 +231,7 @@ Fehlt dein Tool? [Erstelle ein Issue](https://github.com/xiufengsun/TokenTracker
|
|
|
231
231
|
|
|
232
232
|
| Funktion | **[TokenTracker](https://github.com/xiufengsun/TokenTracker)** | **[ccusage](https://github.com/ccusage/ccusage)** | **[Tokscale](https://github.com/junhoyeo/tokscale)** |
|
|
233
233
|
|---|:---:|:---:|:---:|
|
|
234
|
-
| **Unterstützte KI-Tools** | **
|
|
234
|
+
| **Unterstützte KI-Tools** | **44** | Multi-Agent | Multi-Agent |
|
|
235
235
|
| **Primäre Benutzeroberfläche** | Native Desktop-Apps & Web-Dashboard | Terminal-CLI | Terminal-TUI & CLI |
|
|
236
236
|
| **Local-First-Analyse** | ✅ | ✅ | ✅ |
|
|
237
237
|
| **Native Desktop-Apps** | ✅ macOS, Windows, Linux | ❌ | ❌ |
|
|
@@ -314,7 +314,7 @@ Konfiguriere dieses Verhalten über die Umgebungsvariable `TOKENTRACKER_WSL_MODE
|
|
|
314
314
|
|
|
315
315
|
Unterstützte Provider für WSL-Erkennung und Zusammenführung (Aggregation):
|
|
316
316
|
* **Zusammenführung bei paralleler Installation (`both`-Modus):**
|
|
317
|
-
* **Dateibasiert (Logs & Transkripte):** Every Code, Kimi (legacy & Code), Gemini CLI, Antigravity, OpenCode (JSON), Codex CLI, CodeBuddy, WorkBuddy, oh-my-pi (omp), pi, GitHub Copilot (OTEL), Roo Code, Craft, Kilo Code, Droid.
|
|
317
|
+
* **Dateibasiert (Logs & Transkripte):** Every Code, Kimi (legacy & Code), Gemini CLI, Antigravity, OpenCode (JSON), Codex CLI, CodeBuddy, WorkBuddy, WorkBuddy AI, oh-my-pi (omp), pi, GitHub Copilot (OTEL), Roo Code, Craft, Kilo Code, Droid.
|
|
318
318
|
* **Datenbankbasiert (SQLite):** Hermes, Zed Agent, Goose, OpenCode (`opencode.db`), Kilo CLI, Mimo Code, ZCode, GitHub Copilot (App DB).
|
|
319
319
|
* **WSL-Erkennung (nur Präferenz/Isolierung, keine Zusammenführung):**
|
|
320
320
|
* Grok Build (wählt dynamisch entweder die native oder WSL-Umgebung je nach Modus, führt aber im `both`-Modus nicht beide zusammen).
|
package/README.ja.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
### AI に使ったコストを正確に把握 — すべての CLI を横断して
|
|
8
8
|
|
|
9
|
-
**
|
|
9
|
+
**44 種類の AI コーディングツール**からトークン数を自動収集し、ローカルで集計、美しいダッシュボードで本当のコスト推移を可視化します。クラウドアカウント不要、API キー不要、セットアップ不要 — コマンド 1 つで完了です。
|
|
10
10
|
|
|
11
11
|
[](https://www.npmjs.com/package/tokentracker-cli)
|
|
12
12
|
[](https://www.npmjs.com/package/tokentracker-cli)
|
|
@@ -88,7 +88,7 @@ brew install xiufengsun/tokentracker/tokentracker
|
|
|
88
88
|
|
|
89
89
|
## ✨ 機能
|
|
90
90
|
|
|
91
|
-
- 🔌 **
|
|
91
|
+
- 🔌 **44 種類の AI ツールを標準対応** — Claude Code、Codex CLI、AStudio、Cursor、Gemini CLI、Antigravity、Kiro、OpenCode、OpenClaw、Every Code、Hermes Agent、GitHub Copilot、Kimi Code、CodeBuddy、WorkBuddy、Grok Build、oh-my-pi、OmO、pi、Dots、Prime Agent、Craft Agents、Reasonix、Kilo CLI、Kilo Code、Roo Code、Zed Agent、Goose、Droid、Mimo Code、ZCode、Qoder、AnythingLLM Desktop、Claude Science、DeepSeek Harness、TRAE Work CN、LM Studio、Unsloth Studio、Devin CLI、Cline、MiniMax Code、Command Code、TRAE
|
|
92
92
|
- 🏠 **ローカルファースト** — すべてマシン上で動作。アカウントや API キーなしでログをローカル解析します。
|
|
93
93
|
- 🚀 **ゼロコンフィグ** — Hook は初回実行で自動インストール。0 からダッシュボードまで 30 秒。
|
|
94
94
|
- 📊 **美しいダッシュボード** — 使用トレンド、モデル別コスト内訳、GitHub スタイルのアクティビティヒートマップ、プロジェクト別の帰属表示
|
|
@@ -229,7 +229,7 @@ brew install xiufengsun/tokentracker/tokentracker
|
|
|
229
229
|
|
|
230
230
|
| 機能 | **[TokenTracker](https://github.com/xiufengsun/TokenTracker)** | **[ccusage](https://github.com/ccusage/ccusage)** | **[Tokscale](https://github.com/junhoyeo/tokscale)** |
|
|
231
231
|
|---|:---:|:---:|:---:|
|
|
232
|
-
| **対応 AI ツール数** | **
|
|
232
|
+
| **対応 AI ツール数** | **44** | マルチエージェント | マルチエージェント |
|
|
233
233
|
| **主なインターフェース** | ネイティブデスクトップアプリ & Web ダッシュボード | ターミナル CLI | ターミナル TUI & CLI |
|
|
234
234
|
| **ローカルファースト解析** | ✅ | ✅ | ✅ |
|
|
235
235
|
| **ネイティブデスクトップアプリ** | ✅ macOS, Windows, Linux | ❌ | ❌ |
|
package/README.ko.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
### 모든 CLI에서 AI에 쓰는 비용을 정확히 파악
|
|
8
8
|
|
|
9
|
-
**
|
|
9
|
+
**44개의 AI 코딩 도구**에서 토큰 수치를 자동으로 수집하고 로컬에서 집계해, 실제 비용 추세를 아름다운 대시보드에서 확인. 클라우드 계정 불필요, API Key 불필요, 셋업 불필요 — 명령 한 줄이면 끝.
|
|
10
10
|
|
|
11
11
|
[](https://www.npmjs.com/package/tokentracker-cli)
|
|
12
12
|
[](https://www.npmjs.com/package/tokentracker-cli)
|
|
@@ -88,7 +88,7 @@ brew install xiufengsun/tokentracker/tokentracker
|
|
|
88
88
|
|
|
89
89
|
## ✨ 기능
|
|
90
90
|
|
|
91
|
-
- 🔌 **
|
|
91
|
+
- 🔌 **44개의 AI 도구 기본 지원** — Claude Code, Codex CLI, AStudio, Cursor, Gemini CLI, Antigravity, Kiro, OpenCode, OpenClaw, Every Code, Hermes Agent, GitHub Copilot, Kimi Code, CodeBuddy, WorkBuddy, WorkBuddy AI, Grok Build, oh-my-pi, OmO, pi, Dots, Prime Agent, Craft Agents, Reasonix, Kilo CLI, Kilo Code, Roo Code, Zed Agent, Goose, Droid, Mimo Code, ZCode, Qoder, AnythingLLM Desktop, Claude Science, DeepSeek Harness, TRAE Work CN, LM Studio, Unsloth Studio, Devin CLI, Cline, MiniMax Code, Command Code, TRAE
|
|
92
92
|
- 🏠 **로컬 우선** — 내 컴퓨터에서 실행됩니다. 계정이나 API Key 없이 로그를 로컬에서 파싱합니다.
|
|
93
93
|
- 🚀 **제로 설정** — 첫 실행 시 Hook 자동 설치. 0에서 대시보드까지 30초.
|
|
94
94
|
- 📊 **아름다운 대시보드** — 사용 추세, 모델별 비용 분석, GitHub 스타일 활동 히트맵, 프로젝트 귀속 정보
|
|
@@ -229,7 +229,7 @@ brew install xiufengsun/tokentracker/tokentracker
|
|
|
229
229
|
|
|
230
230
|
| 기능 | **[TokenTracker](https://github.com/xiufengsun/TokenTracker)** | **[ccusage](https://github.com/ccusage/ccusage)** | **[Tokscale](https://github.com/junhoyeo/tokscale)** |
|
|
231
231
|
|---|:---:|:---:|:---:|
|
|
232
|
-
| **지원하는 AI 도구 수** | **
|
|
232
|
+
| **지원하는 AI 도구 수** | **44** | 멀티 에이전트 지원 | 멀티 에이전트 지원 |
|
|
233
233
|
| **기본 인터페이스** | 네이티브 데스크톱 앱 & 웹 대시보드 | 터미널 CLI | 터미널 TUI & CLI |
|
|
234
234
|
| **로컬 우선 분석** | ✅ | ✅ | ✅ |
|
|
235
235
|
| **네이티브 데스크톱 앱** | ✅ macOS, Windows, Linux | ❌ | ❌ |
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
### Track every AI token — then bring your usage to life
|
|
8
8
|
|
|
9
|
-
An accurate, local-first token usage and cost dashboard for **
|
|
9
|
+
An accurate, local-first token usage and cost dashboard for **44 AI coding tools** — plus a desktop pet, **4 native widgets**, and **15 achievement tracks**. No cloud account, no API keys, no setup.
|
|
10
10
|
|
|
11
11
|
[](https://www.npmjs.com/package/tokentracker-cli)
|
|
12
12
|
[](https://www.npmjs.com/package/tokentracker-cli)
|
|
@@ -147,7 +147,7 @@ An Arch `PKGBUILD` for a local pacman install lives in `TokenTrackerLinux/packag
|
|
|
147
147
|
|
|
148
148
|
## ✨ Features
|
|
149
149
|
|
|
150
|
-
- 🔌 **
|
|
150
|
+
- 🔌 **44 AI tools out of the box** — Claude Code, Codex CLI, AStudio, Cursor, Gemini CLI, Antigravity, Kiro, OpenCode, OpenClaw, Every Code, Hermes Agent, GitHub Copilot, Kimi Code, CodeBuddy, WorkBuddy, WorkBuddy AI, Grok Build, oh-my-pi, OmO, pi, Dots, Prime Agent, Craft Agents, Reasonix, Kilo CLI, Kilo Code, Roo Code, Zed Agent, Goose, Droid, Mimo Code, ZCode, Qoder, AnythingLLM Desktop, Claude Science, DeepSeek Harness, TRAE Work CN, LM Studio, Unsloth Studio, Devin CLI, Cline, MiniMax Code, Command Code, TRAE
|
|
151
151
|
- 🏠 **Local-first** — Runs on your machine. Parses logs locally with no account or API keys needed.
|
|
152
152
|
- 🚀 **Zero config** — Hooks auto-install on first run. From zero to dashboard in 30 seconds.
|
|
153
153
|
- 📊 **Beautiful dashboard** — Usage trends, cost breakdowns by model, GitHub-style activity heatmap, project attribution
|
|
@@ -251,10 +251,11 @@ An Arch `PKGBUILD` for a local pacman install lives in `TokenTrackerLinux/packag
|
|
|
251
251
|
| **oh-my-pi (Pi Coding Agent)** | ✅ Auto | Passive reader (`~/.omp/agent/sessions/**/*.jsonl`) + managed notify extension written by `tokentracker init` to `~/.omp/agent/extensions/tokentracker-notify.ts` for near-real-time sync (skipped if a same-named unmanaged file already exists; removed by `tokentracker uninstall` when still managed) |
|
|
252
252
|
| **CodeBuddy** (Tencent) | ✅ Auto | SessionEnd hook in `~/.codebuddy/settings.json` (Claude-Code fork) |
|
|
253
253
|
| **WorkBuddy** (Tencent) | ✅ Auto | SessionEnd hook in `~/.workbuddy/settings.json` (Claude-Code fork) + passive `projects/**/*.jsonl` scan |
|
|
254
|
+
| **WorkBuddy AI** | ✅ Auto | International build: hooks and passive usage under `~/.workbuddy-ai`; override with `WORKBUDDY_AI_HOME` |
|
|
254
255
|
| **Grok Build** (xAI) | ✅ Auto | SessionEnd hook + passive `updates.jsonl` / `signals.json` scan (`~/.grok/sessions/**/`) |
|
|
255
256
|
| **Kilo CLI** (kilo.ai) | ✅ Auto | Passive SQLite reader (`~/.local/share/kilo/kilo.db`, OpenCode-fork schema) |
|
|
256
257
|
| **Kilo Code** (VS Code extension) | ✅ Auto | Passive `ui_messages.json` reader (Cursor/Code/CodeBuddy/Windsurf globalStorage) |
|
|
257
|
-
| **Antigravity** | ✅ Auto | Passive transcript reader (`~/.gemini/{antigravity,antigravity-ide,antigravity-cli}/brain/**/transcript.jsonl`); quota
|
|
258
|
+
| **Antigravity** | ✅ Auto | Passive transcript reader (`~/.gemini/{antigravity,antigravity-ide,antigravity-cli}/brain/**/transcript.jsonl`); see [quota credentials and Linux keyring setup](docs/antigravity-limits.md). Disable quota lookup with `TOKENTRACKER_DISABLE_ANTIGRAVITY_QUOTA=1` |
|
|
258
259
|
| **OmO** | ✅ Auto | Passive reader (`~/.omo/agent/sessions/**/*.jsonl`, subagent transcripts included). Same session format as oh-my-pi but a separate install root, cursor namespace and source label, so both can be tracked side by side. Reasoning tokens are reported as a subset of output (Codex convention) and are never billed twice |
|
|
259
260
|
| **pi** (`@mariozechner/pi-coding-agent`) | ✅ Auto | Passive reader (`~/.pi/agent/sessions/**/*.jsonl`) |
|
|
260
261
|
| **Dots** | ✅ Auto | Routed through pi's provider split (`pi-dots` source, same passive reader) — no separate hook |
|
|
@@ -303,7 +304,7 @@ Missing your tool? [Open an issue](https://github.com/xiufengsun/TokenTracker/is
|
|
|
303
304
|
|
|
304
305
|
| Capability | **[TokenTracker](https://github.com/xiufengsun/TokenTracker)** | **[ccusage](https://github.com/ccusage/ccusage)** | **[Tokscale](https://github.com/junhoyeo/tokscale)** |
|
|
305
306
|
|---|:---:|:---:|:---:|
|
|
306
|
-
| **AI tools supported** | **
|
|
307
|
+
| **AI tools supported** | **44** | Multi-agent | Multi-agent |
|
|
307
308
|
| **Primary interface** | Desktop apps & web dashboard | Terminal CLI | Terminal TUI & CLI |
|
|
308
309
|
| **Local analysis** | ✅ | ✅ | ✅ |
|
|
309
310
|
| **Native desktop apps** | ✅ macOS, Windows, Linux | ❌ | ❌ |
|
|
@@ -394,7 +395,7 @@ Configure this behavior using the `TOKENTRACKER_WSL_MODE` environment variable:
|
|
|
394
395
|
|
|
395
396
|
Supported providers for WSL auto-discovery and aggregation:
|
|
396
397
|
* **Dual-Install Aggregation (`both` mode):**
|
|
397
|
-
* **File-list & Active CLIs:** Every Code, Kimi (legacy & Code), Gemini CLI, Antigravity, OpenCode (JSON), Codex CLI, AStudio, CodeBuddy, WorkBuddy, oh-my-pi (omp), pi, GitHub Copilot (OTEL), Roo Code, Craft, Kilo Code, Droid, Cline.
|
|
398
|
+
* **File-list & Active CLIs:** Every Code, Kimi (legacy & Code), Gemini CLI, Antigravity, OpenCode (JSON), Codex CLI, AStudio, CodeBuddy, WorkBuddy, WorkBuddy AI, oh-my-pi (omp), pi, GitHub Copilot (OTEL), Roo Code, Craft, Kilo Code, Droid, Cline.
|
|
398
399
|
* **SQLite-based DBs:** Hermes, Zed Agent, Goose, OpenCode (`opencode.db`), Kilo CLI, Mimo Code, ZCode, Qoder, Claude Science (`operon-cli.db`), GitHub Copilot (App DB).
|
|
399
400
|
* **WSL Auto-Discovery (Preference/Isolation only, no dual aggregation):**
|
|
400
401
|
* Grok Build (dynamically selects either native or WSL depending on the mode, but does not aggregate both in `both` mode).
|
package/README.zh-CN.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
### 跨所有 CLI,看清你到底在 AI 上花了多少钱
|
|
8
8
|
|
|
9
|
-
自动采集 **
|
|
9
|
+
自动采集 **44 款 AI 编码工具** 的 token 用量,全程本地聚合,用一套漂亮的 Dashboard 看真实成本与趋势。不需要云账号、不需要 API Key、不需要任何配置 —— 一条命令搞定。
|
|
10
10
|
|
|
11
11
|
[](https://www.npmjs.com/package/tokentracker-cli)
|
|
12
12
|
[](https://www.npmjs.com/package/tokentracker-cli)
|
|
@@ -90,7 +90,7 @@ brew install xiufengsun/tokentracker/tokentracker
|
|
|
90
90
|
|
|
91
91
|
## ✨ 特性
|
|
92
92
|
|
|
93
|
-
- 🔌 **开箱即用支持
|
|
93
|
+
- 🔌 **开箱即用支持 44 款 AI 工具** —— Claude Code、Codex CLI、AStudio、Cursor、Gemini CLI、Kiro、OpenCode、OpenClaw、Every Code、Hermes Agent、GitHub Copilot、Kimi Code、CodeBuddy、WorkBuddy、Grok Build、oh-my-pi、OmO、pi、Dots、Prime Agent、Craft Agents、Reasonix、Kilo CLI、Kilo Code、Roo Code、Antigravity、Zed Agent、Goose、Droid、Mimo Code、ZCode、Qoder、AnythingLLM Desktop、Claude Science、DeepSeek Harness、TRAE Work CN、LM Studio、Unsloth Studio、Devin CLI、Cline、MiniMax Code、Command Code、TRAE
|
|
94
94
|
- 🏠 **本地优先** —— 跑在本地。直接在本地机器解析日志,无需账号或 API Key。
|
|
95
95
|
- 🚀 **零配置** —— 首次运行自动安装所有 hook。30 秒从零到 Dashboard
|
|
96
96
|
- 📊 **漂亮的 Dashboard** —— 用量趋势、按模型的成本分解、GitHub 风格活跃度热力图、按项目归因
|
|
@@ -232,7 +232,7 @@ brew install xiufengsun/tokentracker/tokentracker
|
|
|
232
232
|
|
|
233
233
|
| 功能维度 | **[TokenTracker](https://github.com/xiufengsun/TokenTracker)** | **[ccusage](https://github.com/ccusage/ccusage)** | **[Tokscale](https://github.com/junhoyeo/tokscale)** |
|
|
234
234
|
|---|:---:|:---:|:---:|
|
|
235
|
-
| **支持的 AI 工具数** | **
|
|
235
|
+
| **支持的 AI 工具数** | **44** | 多 Agent / 工具支持 | 多 Agent / 工具支持 |
|
|
236
236
|
| **主要交互方式** | 原生桌面 App 与 Web Dashboard | 终端命令行(CLI) | 终端 TUI 与 CLI |
|
|
237
237
|
| **本地优先分析** | ✅ | ✅ | ✅ |
|
|
238
238
|
| **原生桌面 App** | ✅ macOS、Windows、Linux | ❌ | ❌ |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o,V as H,j as r}from"./__vite-browser-external-
|
|
1
|
+
import{o,V as H,j as r}from"./__vite-browser-external-2g_4s3ot.js";import{Z as R}from"./zap-Daxct1WV.js";import{F}from"./flame-DCzvFKV1.js";import{C as I}from"./calendar-days-B0aDoKSG.js";import{S as G}from"./shield-check-DtT8ACzI.js";const u={name:"blocks",size:24,node:[["path",{d:"M10 22V7a1 1 0 0 0-1-1H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5a1 1 0 0 0-1-1H2",key:"1ah6g2"}],["rect",{x:"14",y:"2",width:"8",height:"8",rx:"1",key:"88lufb"}]]};u.node;const N=o(u);const k={name:"brain",size:24,node:[["path",{d:"M12 18V5",key:"adv99a"}],["path",{d:"M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4",key:"1e3is1"}],["path",{d:"M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5",key:"1gqd8o"}],["path",{d:"M17.997 5.125a4 4 0 0 1 2.526 5.77",key:"iwvgf7"}],["path",{d:"M18 18a4 4 0 0 0 2-7.464",key:"efp6ie"}],["path",{d:"M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517",key:"1gq6am"}],["path",{d:"M6 18a4 4 0 0 1-2-7.464",key:"k1g0md"}],["path",{d:"M6.003 5.125a4 4 0 0 0-2.526 5.77",key:"q97ue3"}]]};k.node;const S=o(k);const v={name:"crown",size:24,node:[["path",{d:"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z",key:"1vdc57"}],["path",{d:"M5 21h14",key:"11awu3"}]]};v.node;const V=o(v);const b={name:"feather",size:24,node:[["path",{d:"M14.086 18.412A2 2 0 0112.67 19H5v-7.672a2 2 0 01.586-1.414L11.75 3.75a6 6 0 118.49 8.49z",key:"1nq9jb"}],["path",{d:"M16 8 2 22",key:"vp34q"}],["path",{d:"M17.488 15H9",key:"16yirz"}]]};b.node;const Z=o(b);const M={name:"folder-git-2",size:24,node:[["path",{d:"M18 19a5 5 0 0 1-5-5v8",key:"sz5oeg"}],["path",{d:"M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5",key:"1w6njk"}],["circle",{cx:"13",cy:"12",r:"2",key:"1j92g6"}],["circle",{cx:"20",cy:"19",r:"2",key:"1obnsp"}]]};M.node;const O=o(M);const _={name:"footprints",size:24,node:[["path",{d:"M4 16v-2.38C4 11.5 2.97 10.5 3 8c.03-2.72 1.49-6 4.5-6C9.37 2 10 3.8 10 5.5c0 3.11-2 5.66-2 8.68V16a2 2 0 1 1-4 0Z",key:"1dudjm"}],["path",{d:"M20 20v-2.38c0-2.12 1.03-3.12 1-5.62-.03-2.72-1.49-6-4.5-6C14.63 6 14 7.8 14 9.5c0 3.11 2 5.66 2 8.68V20a2 2 0 1 0 4 0Z",key:"l2t8xc"}],["path",{d:"M16 17h4",key:"1dejxt"}],["path",{d:"M4 13h4",key:"1bwh8b"}]]};_.node;const P=o(_);const x={name:"heart",size:24,node:[["path",{d:"M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5",key:"mvr1a0"}]]};x.node;const X=o(x);const w={name:"medal",size:24,node:[["path",{d:"M7.21 15 2.66 7.14a2 2 0 0 1 .13-2.2L4.4 2.8A2 2 0 0 1 6 2h12a2 2 0 0 1 1.6.8l1.6 2.14a2 2 0 0 1 .14 2.2L16.79 15",key:"143lza"}],["path",{d:"M11 12 5.12 2.2",key:"qhuxz6"}],["path",{d:"m13 12 5.88-9.8",key:"hbye0f"}],["path",{d:"M8 7h8",key:"i86dvs"}],["circle",{cx:"12",cy:"17",r:"5",key:"qbz8iq"}],["path",{d:"M12 18v-2h-.5",key:"fawc4q"}]]};w.node;const K=o(w);const z={name:"moon-star",size:24,node:[["path",{d:"M18 5h4",key:"1lhgn2"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",key:"kfwtm"}]]};z.node;const U=o(z);const A={name:"rocket",size:24,node:[["path",{d:"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5",key:"qeys4"}],["path",{d:"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09",key:"u4xsad"}],["path",{d:"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z",key:"676m9"}],["path",{d:"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05",key:"92ym6u"}]]};A.node;const W=o(A);const D={name:"trending-up",size:24,node:[["path",{d:"M16 7h6v6",key:"box55l"}],["path",{d:"m22 7-8.5 8.5-5-5L2 17",key:"1t1m79"}]]};D.node;const Y=o(D),$=[{id:"token_titan",scope:"cloud",icon:V,format:"tokens",art:"/achievements/token-titan.png"},{id:"big_day",scope:"cloud",icon:R,format:"tokens",art:"/achievements/big-day.png"},{id:"wordsmith",scope:"cloud",icon:Z,format:"tokens",art:"/achievements/wordsmith.png"},{id:"marathoner",scope:"cloud",icon:P,format:"days",art:"/achievements/marathoner.png"},{id:"streak",scope:"cloud",icon:F,format:"days",art:"/achievements/streak.png"},{id:"weekend_warrior",scope:"cloud",icon:I,format:"days",art:"/achievements/weekend-warrior.png"},{id:"momentum",scope:"cloud",icon:Y,format:"multiplier",art:"/achievements/momentum.png"},{id:"polyglot",scope:"cloud",icon:S,format:"count",art:"/achievements/polyglot.png"},{id:"trendsetter",scope:"cloud",icon:W,format:"count",art:"/achievements/trendsetter.png"},{id:"multitool",scope:"cloud",icon:N,format:"count",art:"/achievements/multitool.png"},{id:"podium",scope:"cloud",icon:K,format:"rank",art:"/achievements/podium.png"},{id:"veteran",scope:"cloud",icon:G,format:"days",art:"/achievements/veteran.png"},{id:"project_hopper",scope:"local",icon:O,format:"count",art:"/achievements/project-hopper.png"},{id:"project_devotion",scope:"local",icon:X,format:"tokens",art:"/achievements/project-devotion.png"},{id:"night_owl",scope:"local",icon:U,format:"count",art:"/achievements/night-owl.png"}],j=new Map($.map(e=>[e.id,e])),m=new Map($.map((e,a)=>[e.id,a]));function de(e,a){return`achievements.badge.${e}.${a}`}function J(e){return[...e||[]].sort((a,t)=>{const c=(t?.tier||0)-(a?.tier||0);return c!==0?c:(m.get(a?.id)??99)-(m.get(t?.id)??99)})}function re(e){const a=(e||[]).filter(t=>t&&(t.tier||0)>=1&&j.has(t.id));return a.length===0?null:J(a)[0]}const E={1:"bronze",2:"silver",3:"gold",4:"diamond"},ie=["bronze","silver","gold","diamond"],Q={bronze:{rim:["#a06a44","#5c3a22"],face:["#d29a6c","#96602f"],glyph:"#3f2817",ring:"#e8c3a0",sheen:"rgba(255, 236, 220, 0.45)",label:"#a06a44"},silver:{rim:["#aab3bb","#67707b"],face:["#dde2e7","#9ba5ae"],glyph:"#39424b",ring:"#f2f5f7",sheen:"rgba(255, 255, 255, 0.55)",label:"#8b959f"},gold:{rim:["#c9971c","#8a6508"],face:["#f2ca52","#cf9c26"],glyph:"#5c430e",ring:"#ffe9a8",sheen:"rgba(255, 248, 214, 0.55)",label:"#b8860b"},diamond:{rim:["#62b1e0","#7c6fd9"],face:["#c8ecf6","#84b4ea"],glyph:"#27496d",ring:"#eafcff",sheen:"rgba(255, 255, 255, 0.65)",label:"#5a9bd8"}},g={rim:["#a8ada9","#7c817d"],face:["#cdd2ce","#a3a8a4"],glyph:"#6a706c",ring:"#dde1de",sheen:"rgba(255, 255, 255, 0.25)",label:"#8b908c"};function ee(e,a=!1){return a||!e||e<1?g:Q[E[Math.min(e,4)]]||g}function se(e){return E[e]||null}const f={xs:18,sm:24,md:44,xl:88,lg:108},y={xs:.75,sm:1,md:1.5,xl:2,lg:2};function le({badgeId:e,tier:a=0,size:t="md",locked:c=!1,label:i,className:L=""}){const s=j.get(e),p=c||!a||a<1,n=ee(a,p),d=t==="fill",l=d?"100%":f[t]||f.md,T=d?4:y[t]||y.md,[C,q]=H.useState(!1),h=s?.icon||null,B=!!s?.art&&!C;return r.jsx("span",{role:i?"img":void 0,"aria-label":i||void 0,"aria-hidden":i?void 0:!0,className:`inline-flex shrink-0 rounded-full ${L}`,style:{width:l,height:l,padding:T,background:`linear-gradient(135deg, ${n.rim[0]} 0%, ${n.ring} 42%, ${n.rim[1]} 100%)`,boxShadow:d||t==="md"||t==="xl"||t==="lg"?"0 0 0 1px rgba(10, 15, 12, 0.06), 0 1px 2px rgba(10, 15, 12, 0.08)":void 0},children:B?r.jsx("img",{src:s.art,alt:"",draggable:!1,loading:"lazy",onError:()=>q(!0),className:"h-full w-full rounded-full object-cover",style:p?{filter:"grayscale(1)",opacity:.55}:void 0}):r.jsx("span",{className:"flex h-full w-full items-center justify-center rounded-full",style:{background:`linear-gradient(145deg, ${n.face[0]}, ${n.face[1]})`},children:h?r.jsx(h,{size:d?64:Math.round(l*.5),color:n.glyph,strokeWidth:2}):null})})}export{le as A,$ as B,X as H,Y as T,Q as a,de as b,j as c,ie as d,re as h,ee as p,J as s,se as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/BadgeDetailModal-
|
|
2
|
-
import{r as l,Q as h,S as f,U as p,j as e,c,L as v,V as g,a as y,W as b,Y as k,_ as j}from"./__vite-browser-external-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/BadgeDetailModal-B_n4aj2S.js","assets/__vite-browser-external-2g_4s3ot.js","assets/__vite-browser-external-LpFw4zXh.css","assets/react-DlHjGQFN.js","assets/AchievementBadge-Dazs3pEa.js","assets/zap-Daxct1WV.js","assets/flame-DCzvFKV1.js","assets/calendar-days-B0aDoKSG.js","assets/shield-check-DtT8ACzI.js","assets/use-transform-CIdxjmI8.js","assets/use-reduced-motion-D1gcKJUo.js","assets/AchievementsSection-BLqczmU9.js","assets/format-tokens-CSTEYK2m.js","assets/DialogTitle-B-VifiA3.js","assets/composite-INW-ELWX.js","assets/store-gHeBU8dQ.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as l,Q as h,S as f,U as p,j as e,c,L as v,V as g,a as y,W as b,Y as k,_ as j}from"./__vite-browser-external-2g_4s3ot.js";import{A as w}from"./AchievementsSection-BLqczmU9.js";import{B as x}from"./AchievementBadge-Dazs3pEa.js";import"./react-DlHjGQFN.js";import"./format-tokens-CSTEYK2m.js";import"./use-reduced-motion-D1gcKJUo.js";import"./zap-Daxct1WV.js";import"./flame-DCzvFKV1.js";import"./calendar-days-B0aDoKSG.js";import"./shield-check-DtT8ACzI.js";function N({enabled:a=!0}={}){const[r,t]=l.useState({status:"loading",achievements:[],error:null}),s=l.useMemo(()=>h(),[]);return l.useEffect(()=>{if(!a){t({status:"disabled",achievements:[],error:null});return}let i=!1;return t(n=>({...n,status:"loading"})),f({timeZone:s,tzOffsetMinutes:p()}).then(n=>{i||t({status:"ready",achievements:Array.isArray(n?.achievements)?n.achievements:[],error:null})}).catch(n=>{i||t({status:"error",achievements:[],error:n})}),()=>{i=!0}},[a,s]),r}const A=g.lazy(()=>j(()=>import("./BadgeDetailModal-B_n4aj2S.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])));function I({authLoading:a,authEnabled:r,authUserId:t,mockEnabled:s}){if(s)return{authLoading:!1,signedIn:!0,userId:"mock-user"};const i=!!(r&&t);return{authLoading:!!a,signedIn:i,userId:i?t:null}}function B(){const a=y(),[r,t]=l.useState({status:"loading",achievements:[],userId:null}),s=b(),{authLoading:i,signedIn:n,userId:o}=I({authLoading:a?.loading,authEnabled:a?.enabled,authUserId:a?.user?.id,mockEnabled:s});return l.useEffect(()=>{if(i){t({status:"loading",achievements:[],userId:null});return}if(!n){t({status:"signed-out",achievements:[],userId:null});return}let d=!1;return t({status:"loading",achievements:[],userId:o}),(async()=>{try{const u=s?null:await a.getAccessToken?.(),m=await k({accessToken:u,userId:o});if(d)return;t({status:"ready",achievements:Array.isArray(m?.badges)?m.badges:[],userId:o})}catch{d||t({status:"error",achievements:[],userId:o})}})(),()=>{d=!0}},[i,s,n,o]),{...r,signedIn:n,settled:_({authLoading:i,signedIn:n,userId:o,state:r})}}function _({authLoading:a,signedIn:r,userId:t,state:s}){return a?!1:r?s.userId===t&&(s.status==="ready"||s.status==="error"):s.status==="signed-out"}function S(){return e.jsx("div",{className:"mx-0 grid animate-pulse grid-cols-[repeat(3,max-content)] justify-between gap-y-7 sm:-mx-2 sm:grid-cols-[repeat(4,max-content)] lg:grid-cols-[repeat(5,max-content)]","aria-hidden":!0,children:Array.from({length:x.length}).map((a,r)=>e.jsxs("div",{className:"flex w-[6.75rem] flex-col items-center px-0 pb-3 pt-4 sm:w-[7.75rem]",children:[e.jsx("div",{className:"h-[108px] w-[108px] rounded-full bg-oai-gray-200 dark:bg-oai-gray-800"}),e.jsx("div",{className:"mt-3 h-3 w-16 rounded bg-oai-gray-200 dark:bg-oai-gray-800"}),e.jsx("div",{className:"mt-2 h-2 w-10 rounded bg-oai-gray-100 dark:bg-oai-gray-800/60"})]},r))})}function R(){const a=N(),r=B(),[t,s]=l.useState(null),i=a.status==="loading"||!r.settled,n=l.useMemo(()=>[...r.achievements||[],...a.achievements||[]],[r.achievements,a.achievements]),o=l.useMemo(()=>n.filter(u=>(u?.tier||0)>=1).length,[n]),d=x.length;return e.jsxs("div",{className:"flex flex-1 flex-col font-oai text-oai-black antialiased dark:text-oai-white",children:[e.jsx("main",{className:"flex-1 pb-12 pt-8 sm:pb-16 sm:pt-10",children:e.jsxs("div",{className:"mx-auto max-w-4xl px-4 sm:px-6",children:[e.jsxs("div",{className:"mb-7 flex items-baseline justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("h1",{className:"text-3xl font-semibold tracking-tight text-oai-black dark:text-white sm:text-4xl",children:c("achievements.page.title")}),e.jsx("p",{className:"mt-1.5 text-sm text-oai-gray-500 dark:text-oai-gray-400",children:c("achievements.page.local_note")})]}),!i&&e.jsxs("div",{className:"shrink-0 text-right",children:[e.jsxs("div",{className:"font-mono text-2xl font-semibold leading-none tabular-nums text-oai-black dark:text-white",children:[o,e.jsxs("span",{className:"text-oai-gray-400 dark:text-oai-gray-600",children:["/",d]})]}),e.jsx("div",{className:"mt-2 h-1 w-24 overflow-hidden rounded-full bg-oai-gray-200 dark:bg-oai-gray-800",children:e.jsx("div",{className:"h-full rounded-full bg-oai-brand-600 transition-[width] duration-500",style:{width:`${Math.round(o/d*100)}%`}})})]})]}),!r.signedIn&&!i&&e.jsxs("div",{className:"mb-6 flex flex-wrap items-center justify-between gap-x-4 gap-y-2 rounded-xl border border-oai-gray-200 bg-oai-gray-50 px-4 py-3 dark:border-oai-gray-800 dark:bg-oai-gray-900/60",children:[e.jsx("p",{className:"text-sm text-oai-gray-600 dark:text-oai-gray-300",children:c("achievements.signin.prompt")}),e.jsx(v,{to:"/login",className:"shrink-0 rounded-lg bg-oai-brand-600 px-3 py-1.5 text-sm font-medium text-white transition-colors duration-200 hover:bg-oai-brand-700 active:scale-[0.98]",children:c("achievements.signin.action")})]}),i?e.jsx(S,{}):e.jsxs(e.Fragment,{children:[e.jsx(w,{achievements:n,isOwn:!0,columns:"wide",size:"lg",animateIn:!0,onSelect:s}),e.jsxs("p",{className:"mt-10 text-center text-xs text-oai-gray-400 dark:text-oai-gray-500",children:[c("achievements.page.suggest")," ",e.jsx("a",{href:"https://github.com/xiufengsun/TokenTracker/issues",target:"_blank",rel:"noopener noreferrer",className:"underline decoration-oai-gray-300 underline-offset-2 transition-colors hover:text-oai-gray-700 hover:decoration-oai-gray-500 dark:decoration-oai-gray-600 dark:hover:text-oai-gray-300",children:c("achievements.page.suggest_link")})]})]})]})}),t&&e.jsx(g.Suspense,{fallback:null,children:e.jsx(A,{badge:t,onClose:()=>s(null)})})]})}export{_ as cloudBadgesSettled,R as default,I as resolveCloudBadgeIdentity};
|
package/dashboard/dist/assets/{AchievementsSection-DiXyIoa0.js → AchievementsSection-BLqczmU9.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as $,j as s,c as l}from"./__vite-browser-external-
|
|
1
|
+
import{o as $,j as s,c as l}from"./__vite-browser-external-2g_4s3ot.js";import{m as C}from"./react-DlHjGQFN.js";import{B as x,s as b,b as T,t as B,A as E,a as L}from"./AchievementBadge-Dazs3pEa.js";import{f as D}from"./format-tokens-CSTEYK2m.js";import{u as I}from"./use-reduced-motion-D1gcKJUo.js";const v={name:"hard-drive",size:24,node:[["path",{d:"M10 16h.01",key:"1bzywj"}],["path",{d:"M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"18tbho"}],["path",{d:"M21.946 12.013H2.054",key:"zqlbp7"}],["path",{d:"M6 16h.01",key:"1pmjb7"}]]};v.node;const z=$(v);function V(r,i){const t=Number(i)||0;switch(r){case"tokens":return D(t);case"rank":return`#${Math.round(t)}`;case"multiplier":return`${(Math.round(t*10)/10).toString()}×`;default:return Math.round(t).toLocaleString()}}function F(r){if(!r)return 0;const i=Number(r.next_threshold),t=Number(r.metric_value??r.value);if(!Number.isFinite(i)||i<=0)return r.tier>=4?1:0;if(!Number.isFinite(t)||t<=0)return 0;const o=r.lower_is_better?i/t:t/i;return Math.max(0,Math.min(1,o))}function q(r){const i=r?.achieved||{},t=Object.values(i).map(o=>o?Date.parse(o):NaN).filter(o=>Number.isFinite(o));return t.length>0?Math.max(...t):null}function K({achievements:r,isOwn:i=!1,scope:t,onSelect:o,size:m="xl",columns:y="default",animateIn:k=!1,className:N=""}){const j=I(),u=k&&!j,p=new Map;for(const e of Array.isArray(r)?r:[])e&&e.id&&p.set(e.id,e);const g=t?x.filter(e=>e.scope===t):x;let c;if(i){const e=g.map(a=>({entry:a,record:p.get(a.id)||{id:a.id,tier:0}})),n=b(e.filter(a=>(a.record.tier||0)>=1).map(a=>({...a,id:a.entry.id,tier:a.record.tier}))),h=e.filter(a=>(a.record.tier||0)<1);c=[...n,...h]}else c=b(g.map(e=>({entry:e,record:p.get(e.id)})).filter(e=>e.record&&(e.record.tier||0)>=1).map(e=>({...e,id:e.entry.id,tier:e.record.tier}))).map(({entry:e,record:n})=>({entry:e,record:n}));if(c.length===0)return null;const w=y==="wide"?"grid-cols-[repeat(3,max-content)] sm:grid-cols-[repeat(4,max-content)] lg:grid-cols-[repeat(5,max-content)]":"grid-cols-[repeat(3,max-content)] sm:grid-cols-[repeat(4,max-content)]",M=m==="lg"?"mx-0 sm:-mx-2":"-mx-2 sm:-mx-4",A=m==="lg"?"px-0":"px-1";return s.jsx("div",{className:`${M} grid justify-between gap-y-7 ${w} ${N}`,children:c.map(({entry:e,record:n},h)=>{const a=(n.tier||0)>=1,f=l(T(e.id,"name")),d=a?B(n.tier):null,_=F(n);return s.jsxs(C.button,{type:"button",initial:u?{opacity:0,y:16,scale:.9}:!1,animate:u?{opacity:1,y:0,scale:1}:void 0,whileTap:u?{scale:.97}:void 0,transition:{delay:.05+h*.035,duration:.45,ease:[.16,1,.3,1]},onClick:o?()=>o({...n,id:e.id}):void 0,className:`group flex w-[6.75rem] flex-col items-center rounded-xl ${A} pb-3 pt-4 text-center transition-[background-color,transform] duration-200 ease-out hover:bg-oai-gray-50 active:scale-[0.97] dark:hover:bg-oai-gray-900/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand/60 sm:w-[7.75rem]`,"aria-label":l("achievements.badge.aria",{name:f,tier:d?l(`achievements.tier.${d}`):l("achievements.modal.locked")}),children:[s.jsx(E,{badgeId:e.id,tier:n.tier,locked:!a,size:m,className:"transition-transform duration-200 ease-out group-hover:-translate-y-0.5 group-hover:scale-105"}),s.jsxs("span",{className:"mt-2.5 flex w-full items-center justify-center gap-1",children:[s.jsx("span",{title:f,className:"min-w-0 truncate text-xs font-medium leading-tight text-oai-gray-800 dark:text-oai-gray-200",children:f}),e.scope==="local"&&s.jsx("span",{title:l("achievements.page.local_note"),"aria-label":l("achievements.scope.local"),className:"inline-flex shrink-0 text-oai-gray-400 dark:text-oai-gray-500",children:s.jsx(z,{size:11,strokeWidth:2,"aria-hidden":!0})})]}),s.jsx("span",{className:"mt-1 flex h-4 w-full items-center justify-center",children:a?s.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-[0.08em]",style:{color:L[d]?.label},children:l(`achievements.tier.${d}`)}):i?s.jsx("span",{className:"h-[3px] w-14 overflow-hidden rounded-full bg-oai-gray-200 dark:bg-oai-gray-800",children:s.jsx("span",{className:"block h-full rounded-full bg-oai-brand/70",style:{width:`${Math.round(_*100)}%`}})}):null})]},e.id)})})}export{K as A,F as b,V as f,q as l};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as L,j as a,v as De,c as h,y as ye,X as Ie}from"./__vite-browser-external-Bq8nj-JV.js";import{k as _e,V as Me,l as Ve,r as Te,n as $e,o as be,q as ve,s as Oe,t as Re,v as Be,w as Pe,x as Ke,y as Ce,z as Fe,A as Le,B as Xe,S as Ge,H as We,C as G,D as ze,E as Ue,e as Ye,F as He,m as C}from"./react-gIVxucOB.js";import{c as je,A as Ze,p as qe,b as U,t as le,a as T,d as Je}from"./AchievementBadge-CKjtQp-U.js";import{u as Qe,a as z}from"./use-transform-C25eCuz_.js";import{u as et}from"./use-reduced-motion-DK2oZ2uC.js";import{l as ce,f as ue,b as tt}from"./AchievementsSection-DiXyIoa0.js";import{D as nt,a as rt,b as at,c as st,d as it,e as ot}from"./DialogTitle-BsaIbN8k.js";import"./zap-CyH0tvKM.js";import"./flame-BSsCvgT8.js";import"./calendar-days-D_pxFQvT.js";import"./shield-check-9-sqQKdD.js";import"./format-tokens-N22Wqv1X.js";import"./composite-kLwqpqEk.js";import"./store-DstuWd4a.js";const lt=(e,t,n)=>{const r=t-e;return((n-e)%r+r)%r+e};function Ne(e,t){return _e(e)?e[lt(0,e.length,t)]:e}class ct{constructor(t){this.stop=()=>this.runAll("stop"),this.animations=t.filter(Boolean)}get finished(){return Promise.all(this.animations.map(t=>t.finished))}getAll(t){return this.animations[0][t]}setAll(t,n){for(let r=0;r<this.animations.length;r++)this.animations[r][t]=n}attachTimeline(t){const n=this.animations.map(r=>r.attachTimeline(t));return()=>{n.forEach((r,s)=>{r&&r(),this.animations[s].stop()})}}get time(){return this.getAll("time")}set time(t){this.setAll("time",t)}get speed(){return this.getAll("speed")}set speed(t){this.setAll("speed",t)}get state(){return this.getAll("state")}get startTime(){return this.getAll("startTime")}get duration(){return de(this.animations,"duration")}get iterationDuration(){return de(this.animations,"iterationDuration")}runAll(t){this.animations.forEach(n=>n[t]())}play(){this.runAll("play")}pause(){this.runAll("pause")}cancel(){this.runAll("cancel")}complete(){this.runAll("complete")}}function de(e,t){let n=0;for(let r=0;r<e.length;r++){const s=e[r][t];s!==null&&s>n&&(n=s)}return n}class ut extends ct{then(t,n){return this.finished.finally(t).then(()=>{})}}function dt(e,t){return e in t}class mt extends Me{constructor(){super(...arguments),this.type="object"}readValueFromInstance(t,n){if(dt(n,t)){const r=t[n];if(typeof r=="string"||typeof r=="number")return r}}getBaseTargetFromProps(){}removeValueFromRenderState(t,n){delete n.output[t]}measureInstanceViewportBox(){return Ve()}build(t,n){Object.assign(t.output,n)}renderInstance(t,{output:n}){Object.assign(t,n)}sortInstanceNodePosition(){return 0}}function Y(e){return typeof e=="object"&&!Array.isArray(e)}function ke(e,t,n,r){return e==null?[]:typeof e=="string"&&Y(t)?Te(e,n,r):e instanceof NodeList?Array.from(e):Array.isArray(e)?e.filter(s=>s!=null):[e]}function ft(e,t,n){return e*(t+1)+n*t}function me(e,t,n,r){return typeof t=="number"?t:t.startsWith("-")||t.startsWith("+")?Math.max(0,e+parseFloat(t)):t==="<"?n:t.startsWith("<")?Math.max(0,n+parseFloat(t.slice(1))):r.get(t)??e}function pt(e,t,n){for(let r=0;r<e.length;r++){const s=e[r];s.at>t&&s.at<n&&(be(e,s),r--)}}function ht(e,t,n,r,s,c){pt(e,s,c);for(let i=0;i<t.length;i++)e.push({value:t[i],at:$e(s,c,r[i]),easing:Ne(n,i)})}function gt(e,t,n=0){const r=t+1+t*n;for(let s=0;s<e.length;s++)e[s]=e[s]/r}function xt(e,t){return e.at===t.at?e.value===null?1:t.value===null?-1:0:e.at-t.at}const yt="easeInOut",bt=20;function vt(e,{defaultTransition:t={},...n}={},r,s){const c=t.duration||.3,i=new Map,f=new Map,m={},p=new Map;let g=0,u=0,x=0;for(let N=0;N<e.length;N++){const k=e[N];if(typeof k=="string"){p.set(k,u);continue}else if(!Array.isArray(k)){p.set(k.name,me(u,k.at,g,p));continue}let[E,b,v={}]=k;v.at!==void 0&&(u=me(u,v.at,g,p));let j=0;const _=(w,M,A,o=0,l=0)=>{const d=jt(w),{delay:D=0,times:y=Oe(d),type:R=t.type||"keyframes",repeat:B,repeatType:W,repeatDelay:H=0,...Se}=M;let{ease:I=t.ease||"easeOut",duration:S}=M;const Z=typeof D=="function"?D(o,l):D,q=d.length,J=Ke(R)?R:s?.[R||"keyframes"];if(q<=2&&J){let $=100;if(q===2&&wt(d)){const P=d[1]-d[0];$=Math.abs(P)}const O={...t,...Se};S!==void 0&&(O.duration=Ce(S));const X=Re(O,$,J);I=X.ease,S=X.duration}S??(S=c);const Q=u+Z;y.length===1&&y[0]===0&&(y[1]=1);const ee=y.length-d.length;if(ee>0&&Be(y,ee),d.length===1&&d.unshift(null),B&&B<bt){const $=S>0?H/S:0;S=ft(S,B,H);const O=[...d],X=[...y];I=Array.isArray(I)?[...I]:[I];const P=[...I],ne=W==="reverse"||W==="mirror";let re=O,ae=P;ne&&(re=[...O].reverse(),W==="reverse"&&(ae=[...P].reverse().map(V=>typeof V=="function"?Pe(V):V)));for(let V=0;V<B;V++){const se=ne&&V%2===0,ie=se?re:O,Ee=se?ae:P,oe=(V+1)*(1+$);$>0&&(d.push(d[d.length-1]),y.push(oe),I.push("linear")),d.push(...ie);for(let K=0;K<ie.length;K++)y.push(X[K]+oe),I.push(K===0?"linear":Ne(Ee,K-1))}gt(y,B,$)}const te=Q+S;ht(A,d,I,y,Q,te),j=Math.max(Z+S,j),x=Math.max(te,x)};if(ve(E)){const w=fe(E,f);_(b,v,pe("default",w))}else{const w=ke(E,b,r,m),M=w.length;for(let A=0;A<M;A++){b=b,v=v;const o=w[A],l=fe(o,f);for(const d in b)_(b[d],Nt(v,d),pe(d,l),A,M)}}g=u,u+=j}return f.forEach((N,k)=>{for(const E in N){const b=N[E];b.sort(xt);const v=[],j=[],_=[];for(let o=0;o<b.length;o++){const{at:l,value:d,easing:D}=b[o];v.push(d),j.push(Fe(0,x,l)),_.push(D||"easeOut")}j[0]!==0&&(j.unshift(0),v.unshift(v[0]),_.unshift(yt)),j[j.length-1]!==1&&(j.push(1),v.push(null)),i.has(k)||i.set(k,{keyframes:{},transition:{}});const w=i.get(k);w.keyframes[E]=v;const{type:M,...A}=t;w.transition[E]={...A,duration:x,ease:_,times:j,...n}}}),i}function fe(e,t){return!t.has(e)&&t.set(e,{}),t.get(e)}function pe(e,t){return t[e]||(t[e]=[]),t[e]}function jt(e){return Array.isArray(e)?e:[e]}function Nt(e,t){return e&&e[t]?{...e,...e[t]}:{...e}}const kt=e=>typeof e=="number",wt=e=>e.every(kt);function At(e){const t={presenceContext:null,props:{},visualState:{renderState:{transform:{},transformOrigin:{},style:{},vars:{},attrs:{}},latestValues:{}}},n=Le(e)&&!Xe(e)?new Ge(t):new We(t);n.mount(e),G.set(e,n)}function St(e){const t={presenceContext:null,props:{},visualState:{renderState:{output:{}},latestValues:{}}},n=new mt(t);n.mount(e),G.set(e,n)}function Et(e,t){return ve(e)||typeof e=="number"||typeof e=="string"&&!Y(t)}function we(e,t,n,r){const s=[];if(Et(e,t))s.push(ze(e,Y(t)&&t.default||t,n&&(n.default||n)));else{if(e==null)return s;const c=ke(e,t,r),i=c.length;for(let f=0;f<i;f++){const m=c[f],p=m instanceof Element?At:St;G.has(m)||p(m);const g=G.get(m),u={...n};"delay"in u&&typeof u.delay=="function"&&(u.delay=u.delay(f,i)),s.push(...Ue(g,{...t,transition:u},{}))}}return s}function Dt(e,t,n){const r=[],s=e.map(i=>{if(Array.isArray(i)&&typeof i[0]=="function"){const f=i[0],m=Ye(0);return m.on("change",f),i.length===1?[m,[0,1]]:i.length===2?[m,[0,1],i[1]]:[m,i[1],i[2]]}return i});return vt(s,t,n,{spring:He}).forEach(({keyframes:i,transition:f},m)=>{r.push(...we(m,i,f))}),r}function It(e){return Array.isArray(e)&&e.some(Array.isArray)}function _t(e={}){const{scope:t,reduceMotion:n,skipAnimations:r}=e;function s(c,i,f){let m=[],p;const g={};if(n!==void 0&&(g.reduceMotion=n),r!==void 0&&(g.skipAnimations=r),It(c)){const{onComplete:x,...N}=i||{};typeof x=="function"&&(p=x),m=Dt(c,{...g,...N},t)}else{const{onComplete:x,...N}=f||{};typeof x=="function"&&(p=x),m=we(c,i,{...g,...N},t)}const u=new ut(m);return p&&u.finished.then(p),t&&(t.animations.push(u),u.finished.then(()=>{be(t.animations,u)})),u}return s}const F=_t(),he=8;function Mt({badgeId:e,tier:t,locked:n=!1,size:r=176,backLines:s=[],label:c}){const i=Qe(0),f=et(),m=L.useRef(null),p=L.useRef(null),g=L.useRef(!1),u=qe(t,n),x=je.get(e)?.icon||null,N=z(i,o=>`${(o%360+360)%360/360*160-80}%`),k=z(i,o=>`${80-(o%360+360)%360/360*160}%`),E=z(i,o=>{const l=Math.abs(Math.sin(o*Math.PI/180));return Math.max(0,(l-.35)/.65)*.3}),b=()=>{p.current?.stop?.(),p.current=null};L.useEffect(()=>{if(f||g.current)return;let o=!1;i.set(-360);const l=F(i,0,{duration:.9,ease:[.16,1,.3,1]});return p.current=l,l.then(()=>{o||g.current||(p.current=F(i,[0,-14,14,0],{duration:4.5,repeat:1/0,ease:"easeInOut"}))}),()=>{o=!0,b()}},[f,i]);const v=o=>{const l=i.get();if(f){const y=Math.round(l/180)*180;p.current=F(i,y,{duration:.2,ease:"easeOut"});return}const d=l+o*.35,D=Math.round(d/180)*180;p.current=F(i,D,{type:"spring",velocity:o,stiffness:58,damping:13.5,mass:1})},j=o=>{g.current=!0,b(),o.currentTarget.setPointerCapture?.(o.pointerId),m.current={pointerId:o.pointerId,startX:o.clientX,startRot:i.get(),samples:[{t:o.timeStamp,x:o.clientX}]}},_=o=>{const l=m.current;!l||l.pointerId!==o.pointerId||(i.set(l.startRot+(o.clientX-l.startX)*.55),l.samples.push({t:o.timeStamp,x:o.clientX}),l.samples.length>5&&l.samples.shift())},w=o=>{const l=m.current;if(!l||l.pointerId!==o.pointerId)return;m.current=null;const d=l.samples[0],D=l.samples[l.samples.length-1],y=D.t-d.t,R=y>0?(D.x-d.x)*.55*1e3/y:0;v(R)},M=o=>{if(o.key!=="ArrowLeft"&&o.key!=="ArrowRight")return;o.preventDefault(),g.current=!0,b();const l=o.key==="ArrowRight"?30:-30;p.current=F(i,i.get()+l,{duration:.15,ease:"easeOut"})},A={backfaceVisibility:"hidden",WebkitBackfaceVisibility:"hidden"};return a.jsx("div",{role:"img","aria-label":c,tabIndex:0,onPointerDown:j,onPointerMove:_,onPointerUp:w,onPointerCancel:w,onKeyDown:M,className:"inline-flex cursor-grab select-none items-center justify-center outline-none focus-visible:ring-2 focus-visible:ring-oai-brand/60 rounded-full active:cursor-grabbing",style:{perspective:900,touchAction:"pan-y"},children:a.jsxs("div",{className:"relative",style:{transform:"rotateX(-8deg)",transformStyle:"preserve-3d"},children:[a.jsxs(C.div,{className:"relative",style:{rotateY:i,transformStyle:"preserve-3d",width:r,height:r},children:[[-3,-1.5,0,1.5,3].map(o=>a.jsx("div",{"aria-hidden":!0,className:"absolute inset-0 rounded-full",style:{transform:`translateZ(${o}px)`,background:u.rim[1]}},o)),a.jsxs("div",{className:"absolute inset-0 overflow-hidden rounded-full",style:{...A,transform:`translateZ(${he/2}px)`},children:[a.jsx(Ze,{badgeId:e,tier:t,locked:n,size:"fill",className:"brightness-105 saturate-[1.08]"}),a.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{background:"radial-gradient(circle at 30% 20%, rgba(255,255,255,0.45), rgba(255,255,255,0) 42%), linear-gradient(172deg, rgba(255,255,255,0.14) 0%, rgba(255,255,255,0) 38%, rgba(0,0,0,0.08) 100%)",boxShadow:"inset 0 3px 7px rgba(255,255,255,0.5), inset 0 -3px 8px rgba(0,0,0,0.15)"}}),a.jsx(C.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0",style:{x:N,background:"linear-gradient(105deg, transparent 34%, rgba(255,255,255,0.5) 50%, transparent 66%)"}}),a.jsx(C.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{opacity:E,background:"rgba(8, 12, 10, 0.9)"}})]}),a.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center gap-1 overflow-hidden rounded-full px-6 text-center",style:{...A,transform:`rotateY(180deg) translateZ(${he/2}px)`,background:`linear-gradient(145deg, ${u.face[0]}, ${u.face[1]})`,boxShadow:`inset 0 0 0 6px ${u.rim[1]}, inset 0 0 0 7.5px rgba(255,255,255,0.22), inset 0 3px 7px rgba(255,255,255,0.4), inset 0 -4px 12px rgba(0,0,0,0.22)`},children:[a.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{background:"repeating-radial-gradient(circle at 50% 50%, rgba(255,255,255,0.06) 0px, rgba(255,255,255,0.06) 1px, transparent 1px, transparent 4px)"}}),x?a.jsx(x,{"aria-hidden":!0,size:Math.round(r*.62),strokeWidth:1.1,color:u.glyph,className:"pointer-events-none absolute opacity-[0.13]",style:{filter:"drop-shadow(0 1px 0 rgba(255,255,255,0.3)) drop-shadow(0 -1px 0 rgba(0,0,0,0.35))"}}):null,a.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{background:"radial-gradient(circle at 70% 20%, rgba(255,255,255,0.4), rgba(255,255,255,0) 44%), linear-gradient(188deg, rgba(255,255,255,0.12) 0%, rgba(255,255,255,0) 38%, rgba(0,0,0,0.10) 100%)"}}),s.map((o,l)=>a.jsx("div",{className:`font-mono tabular-nums ${l===0?"text-[10px] uppercase tracking-[0.18em]":l===1?"text-lg font-bold":"text-[11px]"}`,style:{color:u.glyph,textShadow:"0 1px 0 rgba(255,255,255,0.28), 0 -1px 0 rgba(0,0,0,0.3)"},children:o},`${l}-${o}`)),a.jsx(C.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0",style:{x:k,background:"linear-gradient(105deg, transparent 34%, rgba(255,255,255,0.45) 50%, transparent 66%)"}}),a.jsx(C.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{opacity:E,background:"rgba(8, 12, 10, 0.9)"}})]})]}),a.jsx("div",{"aria-hidden":!0,className:"absolute left-1/2 h-3 w-3/5 rounded-[100%] bg-black/20 blur-md dark:bg-black/45",style:{bottom:-20,transform:"translateX(-50%)"}})]})})}function Ae(e){if(!e)return null;const t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleDateString():null}function Vt(e){const t=Number(e);return!Number.isSafeInteger(t)||t<1?null:String(t).padStart(6,"0")}function Tt(e,t,n){if(t?.scope!=="cloud"||!n)return null;const r=Number(e?.serials?.[n]);return Number.isSafeInteger(r)&&r>=1?r:null}function $t({badge:e}){return a.jsx("div",{className:"flex items-center gap-1",children:Je.map((t,n)=>{const r=(e.tier||0)>=n+1,s=Ae(e.achieved?.[t]),c=T[t];return a.jsx("span",{title:s?`${h(`achievements.tier.${t}`)} · ${s}`:h(`achievements.tier.${t}`),className:"inline-flex h-2 w-8 rounded-full",style:r?{background:`linear-gradient(120deg, ${c.rim[0]} 0%, ${c.ring} 55%, ${c.rim[1]} 100%)`,boxShadow:"inset 0 1px 1px rgba(255,255,255,0.4), 0 0 0 1px rgba(10,15,12,0.05)"}:void 0,children:!r&&a.jsx("span",{className:"h-full w-full rounded-full bg-oai-gray-200 dark:bg-oai-gray-800"})},t)})})}function ge({badge:e,onClose:t}){const n=je.get(e.id),r=h(U(e.id,"name")),s=(e.tier||0)>=1,c=s?le(e.tier):null,i=Ae(s?e.achieved?.[c]||(ce(e)?new Date(ce(e)).toISOString():null):null),f=ue(n?.format,e.metric_value),m=tt(e),p=e.tier<4?le((e.tier||0)+1):null,g=Tt(e,n,c),u=Vt(g),x=u?[h("achievements.modal.achieved_label"),h("achievements.modal.issue_number",{number:u}),i||r]:[s?h("achievements.modal.achieved_label"):h("achievements.modal.locked"),s?f:"···",s&&i?i:r];return a.jsxs("div",{className:"flex flex-col items-center px-6 pb-6 pt-5 text-center",children:[a.jsxs("div",{className:"flex w-full items-start justify-between gap-3",children:[a.jsxs("div",{className:"min-w-0 flex-1 text-left",children:[a.jsx("h2",{className:"truncate text-lg font-semibold tracking-tight text-oai-black dark:text-white",children:r}),a.jsx("p",{className:"mt-0.5 text-xs text-oai-gray-500 dark:text-oai-gray-400",children:h(U(e.id,"desc"))})]}),a.jsx("button",{type:"button",onClick:t,"aria-label":h("achievements.modal.close"),className:"shrink-0 rounded-md p-1.5 text-oai-gray-400 transition-colors hover:bg-oai-gray-100 hover:text-oai-gray-700 dark:hover:bg-oai-gray-900 dark:hover:text-oai-gray-200",children:a.jsx(Ie,{size:16})})]}),a.jsx("div",{className:"mt-5 mb-7",children:a.jsx(Mt,{badgeId:e.id,tier:e.tier,locked:!s,backLines:x,label:h("achievements.modal.coin_aria",{name:r})})}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"rounded-full px-2.5 py-0.5 text-[11px] font-semibold uppercase tracking-wide",style:s?{background:`linear-gradient(120deg, ${T[c].rim[0]} 0%, ${T[c].ring} 55%, ${T[c].rim[1]} 100%)`,color:T[c].glyph,textShadow:"0 1px 0 rgba(255,255,255,0.35)",boxShadow:"inset 0 1px 1px rgba(255,255,255,0.4), 0 0 0 1px rgba(10,15,12,0.06)"}:{background:"rgba(128,134,130,0.75)",color:"rgba(250,250,250,0.95)"},children:s?h(`achievements.tier.${c}`):h("achievements.modal.locked")}),s&&i?a.jsx("span",{className:"text-xs tabular-nums text-oai-gray-500 dark:text-oai-gray-400",children:i}):null]}),a.jsxs("dl",{className:"mt-5 w-full space-y-3 border-t border-oai-gray-200/70 pt-4 text-left dark:border-oai-gray-800/60",children:[a.jsxs("div",{className:"flex items-baseline justify-between gap-3 text-sm",children:[a.jsx("dt",{className:"text-oai-gray-500 dark:text-oai-gray-400",children:h("achievements.modal.value_label")}),a.jsx("dd",{className:"font-mono font-semibold tabular-nums text-oai-black dark:text-white",children:f})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-baseline justify-between gap-3 text-xs text-oai-gray-500 dark:text-oai-gray-400",children:[a.jsx("span",{children:e.tier>=4?h("achievements.modal.max_tier"):h("achievements.modal.progress_to_next",{tier:h(`achievements.tier.${p}`)})}),e.tier<4&&e.next_threshold!=null?a.jsxs("span",{className:"font-mono tabular-nums",children:[f," ",e.lower_is_better?"→":"/"," ",ue(n?.format,e.next_threshold)]}):null]}),a.jsx("div",{className:"mt-1.5 h-1.5 w-full overflow-hidden rounded-full bg-oai-gray-200 dark:bg-oai-gray-800",children:a.jsx("div",{className:"h-full rounded-full transition-[width] duration-500",style:{width:`${Math.round((e.tier>=4?1:m)*100)}%`,background:s?`linear-gradient(90deg, ${T[c].rim[0]} 0%, ${T[c].ring} 55%, ${T[c].rim[1]} 100%)`:"rgba(128,134,130,0.75)",boxShadow:s?"inset 0 1px 1px rgba(255,255,255,0.35)":void 0}})})]}),a.jsxs("div",{className:"flex items-center justify-between gap-3 text-xs text-oai-gray-500 dark:text-oai-gray-400",children:[a.jsx("span",{children:h("achievements.modal.tier_history")}),a.jsx($t,{badge:e})]})]})]})}const xe=ye("relative w-full max-w-[380px] flex flex-col","rounded-2xl bg-white dark:bg-oai-gray-950","shadow-[0_20px_60px_-20px_rgba(0,0,0,0.25)] dark:shadow-[0_20px_60px_-10px_rgba(0,0,0,0.65)]","ring-1 ring-oai-gray-200 dark:ring-oai-gray-800 overflow-hidden","dark:border-t dark:border-white/[0.08]");function Ht({badge:e,onClose:t}){const n=De(),r=!!e;return L.useEffect(()=>{if(!n||!r)return;const s=c=>{c.key==="Escape"&&(c.stopPropagation(),t?.())};return window.addEventListener("keydown",s,!0),()=>window.removeEventListener("keydown",s,!0)},[n,r,t]),r?n?a.jsxs("div",{className:"fixed inset-0 z-[120] flex items-center justify-center p-4",children:[a.jsx("div",{className:"absolute inset-0 bg-black/40 backdrop-blur-[2px]",onClick:t,"aria-hidden":!0}),a.jsx("div",{className:xe,children:a.jsx(ge,{badge:e,onClose:t})})]}):a.jsx(nt,{open:!0,onOpenChange:s=>{s||t?.()},children:a.jsxs(rt,{children:[a.jsx(at,{className:"cost-modal-backdrop z-[110]"}),a.jsx(st,{className:"fixed inset-0 z-[120] flex items-center justify-center p-4",children:a.jsxs(it,{className:ye("cost-modal-popup",xe),children:[a.jsx(ot,{render:a.jsx("h2",{className:"sr-only"}),children:h(U(e.id,"name"))}),a.jsx(ge,{badge:e,onClose:t})]})})]})}):null}export{Ht as BadgeDetailModal,Tt as currentBadgeIssueNumber,Ht as default,Vt as formatIssueNumber};
|
|
1
|
+
import{r as L,j as a,v as De,c as h,y as ye,X as Ie}from"./__vite-browser-external-2g_4s3ot.js";import{k as _e,V as Me,l as Ve,r as Te,n as $e,o as be,q as ve,s as Oe,t as Re,v as Be,w as Pe,x as Ke,y as Ce,z as Fe,A as Le,B as Xe,S as Ge,H as We,C as G,D as ze,E as Ue,e as Ye,F as He,m as C}from"./react-DlHjGQFN.js";import{c as je,A as Ze,p as qe,b as U,t as le,a as T,d as Je}from"./AchievementBadge-Dazs3pEa.js";import{u as Qe,a as z}from"./use-transform-CIdxjmI8.js";import{u as et}from"./use-reduced-motion-D1gcKJUo.js";import{l as ce,f as ue,b as tt}from"./AchievementsSection-BLqczmU9.js";import{D as nt,a as rt,b as at,c as st,d as it,e as ot}from"./DialogTitle-B-VifiA3.js";import"./zap-Daxct1WV.js";import"./flame-DCzvFKV1.js";import"./calendar-days-B0aDoKSG.js";import"./shield-check-DtT8ACzI.js";import"./format-tokens-CSTEYK2m.js";import"./composite-INW-ELWX.js";import"./store-gHeBU8dQ.js";const lt=(e,t,n)=>{const r=t-e;return((n-e)%r+r)%r+e};function Ne(e,t){return _e(e)?e[lt(0,e.length,t)]:e}class ct{constructor(t){this.stop=()=>this.runAll("stop"),this.animations=t.filter(Boolean)}get finished(){return Promise.all(this.animations.map(t=>t.finished))}getAll(t){return this.animations[0][t]}setAll(t,n){for(let r=0;r<this.animations.length;r++)this.animations[r][t]=n}attachTimeline(t){const n=this.animations.map(r=>r.attachTimeline(t));return()=>{n.forEach((r,s)=>{r&&r(),this.animations[s].stop()})}}get time(){return this.getAll("time")}set time(t){this.setAll("time",t)}get speed(){return this.getAll("speed")}set speed(t){this.setAll("speed",t)}get state(){return this.getAll("state")}get startTime(){return this.getAll("startTime")}get duration(){return de(this.animations,"duration")}get iterationDuration(){return de(this.animations,"iterationDuration")}runAll(t){this.animations.forEach(n=>n[t]())}play(){this.runAll("play")}pause(){this.runAll("pause")}cancel(){this.runAll("cancel")}complete(){this.runAll("complete")}}function de(e,t){let n=0;for(let r=0;r<e.length;r++){const s=e[r][t];s!==null&&s>n&&(n=s)}return n}class ut extends ct{then(t,n){return this.finished.finally(t).then(()=>{})}}function dt(e,t){return e in t}class mt extends Me{constructor(){super(...arguments),this.type="object"}readValueFromInstance(t,n){if(dt(n,t)){const r=t[n];if(typeof r=="string"||typeof r=="number")return r}}getBaseTargetFromProps(){}removeValueFromRenderState(t,n){delete n.output[t]}measureInstanceViewportBox(){return Ve()}build(t,n){Object.assign(t.output,n)}renderInstance(t,{output:n}){Object.assign(t,n)}sortInstanceNodePosition(){return 0}}function Y(e){return typeof e=="object"&&!Array.isArray(e)}function ke(e,t,n,r){return e==null?[]:typeof e=="string"&&Y(t)?Te(e,n,r):e instanceof NodeList?Array.from(e):Array.isArray(e)?e.filter(s=>s!=null):[e]}function ft(e,t,n){return e*(t+1)+n*t}function me(e,t,n,r){return typeof t=="number"?t:t.startsWith("-")||t.startsWith("+")?Math.max(0,e+parseFloat(t)):t==="<"?n:t.startsWith("<")?Math.max(0,n+parseFloat(t.slice(1))):r.get(t)??e}function pt(e,t,n){for(let r=0;r<e.length;r++){const s=e[r];s.at>t&&s.at<n&&(be(e,s),r--)}}function ht(e,t,n,r,s,c){pt(e,s,c);for(let i=0;i<t.length;i++)e.push({value:t[i],at:$e(s,c,r[i]),easing:Ne(n,i)})}function gt(e,t,n=0){const r=t+1+t*n;for(let s=0;s<e.length;s++)e[s]=e[s]/r}function xt(e,t){return e.at===t.at?e.value===null?1:t.value===null?-1:0:e.at-t.at}const yt="easeInOut",bt=20;function vt(e,{defaultTransition:t={},...n}={},r,s){const c=t.duration||.3,i=new Map,f=new Map,m={},p=new Map;let g=0,u=0,x=0;for(let N=0;N<e.length;N++){const k=e[N];if(typeof k=="string"){p.set(k,u);continue}else if(!Array.isArray(k)){p.set(k.name,me(u,k.at,g,p));continue}let[E,b,v={}]=k;v.at!==void 0&&(u=me(u,v.at,g,p));let j=0;const _=(w,M,A,o=0,l=0)=>{const d=jt(w),{delay:D=0,times:y=Oe(d),type:R=t.type||"keyframes",repeat:B,repeatType:W,repeatDelay:H=0,...Se}=M;let{ease:I=t.ease||"easeOut",duration:S}=M;const Z=typeof D=="function"?D(o,l):D,q=d.length,J=Ke(R)?R:s?.[R||"keyframes"];if(q<=2&&J){let $=100;if(q===2&&wt(d)){const P=d[1]-d[0];$=Math.abs(P)}const O={...t,...Se};S!==void 0&&(O.duration=Ce(S));const X=Re(O,$,J);I=X.ease,S=X.duration}S??(S=c);const Q=u+Z;y.length===1&&y[0]===0&&(y[1]=1);const ee=y.length-d.length;if(ee>0&&Be(y,ee),d.length===1&&d.unshift(null),B&&B<bt){const $=S>0?H/S:0;S=ft(S,B,H);const O=[...d],X=[...y];I=Array.isArray(I)?[...I]:[I];const P=[...I],ne=W==="reverse"||W==="mirror";let re=O,ae=P;ne&&(re=[...O].reverse(),W==="reverse"&&(ae=[...P].reverse().map(V=>typeof V=="function"?Pe(V):V)));for(let V=0;V<B;V++){const se=ne&&V%2===0,ie=se?re:O,Ee=se?ae:P,oe=(V+1)*(1+$);$>0&&(d.push(d[d.length-1]),y.push(oe),I.push("linear")),d.push(...ie);for(let K=0;K<ie.length;K++)y.push(X[K]+oe),I.push(K===0?"linear":Ne(Ee,K-1))}gt(y,B,$)}const te=Q+S;ht(A,d,I,y,Q,te),j=Math.max(Z+S,j),x=Math.max(te,x)};if(ve(E)){const w=fe(E,f);_(b,v,pe("default",w))}else{const w=ke(E,b,r,m),M=w.length;for(let A=0;A<M;A++){b=b,v=v;const o=w[A],l=fe(o,f);for(const d in b)_(b[d],Nt(v,d),pe(d,l),A,M)}}g=u,u+=j}return f.forEach((N,k)=>{for(const E in N){const b=N[E];b.sort(xt);const v=[],j=[],_=[];for(let o=0;o<b.length;o++){const{at:l,value:d,easing:D}=b[o];v.push(d),j.push(Fe(0,x,l)),_.push(D||"easeOut")}j[0]!==0&&(j.unshift(0),v.unshift(v[0]),_.unshift(yt)),j[j.length-1]!==1&&(j.push(1),v.push(null)),i.has(k)||i.set(k,{keyframes:{},transition:{}});const w=i.get(k);w.keyframes[E]=v;const{type:M,...A}=t;w.transition[E]={...A,duration:x,ease:_,times:j,...n}}}),i}function fe(e,t){return!t.has(e)&&t.set(e,{}),t.get(e)}function pe(e,t){return t[e]||(t[e]=[]),t[e]}function jt(e){return Array.isArray(e)?e:[e]}function Nt(e,t){return e&&e[t]?{...e,...e[t]}:{...e}}const kt=e=>typeof e=="number",wt=e=>e.every(kt);function At(e){const t={presenceContext:null,props:{},visualState:{renderState:{transform:{},transformOrigin:{},style:{},vars:{},attrs:{}},latestValues:{}}},n=Le(e)&&!Xe(e)?new Ge(t):new We(t);n.mount(e),G.set(e,n)}function St(e){const t={presenceContext:null,props:{},visualState:{renderState:{output:{}},latestValues:{}}},n=new mt(t);n.mount(e),G.set(e,n)}function Et(e,t){return ve(e)||typeof e=="number"||typeof e=="string"&&!Y(t)}function we(e,t,n,r){const s=[];if(Et(e,t))s.push(ze(e,Y(t)&&t.default||t,n&&(n.default||n)));else{if(e==null)return s;const c=ke(e,t,r),i=c.length;for(let f=0;f<i;f++){const m=c[f],p=m instanceof Element?At:St;G.has(m)||p(m);const g=G.get(m),u={...n};"delay"in u&&typeof u.delay=="function"&&(u.delay=u.delay(f,i)),s.push(...Ue(g,{...t,transition:u},{}))}}return s}function Dt(e,t,n){const r=[],s=e.map(i=>{if(Array.isArray(i)&&typeof i[0]=="function"){const f=i[0],m=Ye(0);return m.on("change",f),i.length===1?[m,[0,1]]:i.length===2?[m,[0,1],i[1]]:[m,i[1],i[2]]}return i});return vt(s,t,n,{spring:He}).forEach(({keyframes:i,transition:f},m)=>{r.push(...we(m,i,f))}),r}function It(e){return Array.isArray(e)&&e.some(Array.isArray)}function _t(e={}){const{scope:t,reduceMotion:n,skipAnimations:r}=e;function s(c,i,f){let m=[],p;const g={};if(n!==void 0&&(g.reduceMotion=n),r!==void 0&&(g.skipAnimations=r),It(c)){const{onComplete:x,...N}=i||{};typeof x=="function"&&(p=x),m=Dt(c,{...g,...N},t)}else{const{onComplete:x,...N}=f||{};typeof x=="function"&&(p=x),m=we(c,i,{...g,...N},t)}const u=new ut(m);return p&&u.finished.then(p),t&&(t.animations.push(u),u.finished.then(()=>{be(t.animations,u)})),u}return s}const F=_t(),he=8;function Mt({badgeId:e,tier:t,locked:n=!1,size:r=176,backLines:s=[],label:c}){const i=Qe(0),f=et(),m=L.useRef(null),p=L.useRef(null),g=L.useRef(!1),u=qe(t,n),x=je.get(e)?.icon||null,N=z(i,o=>`${(o%360+360)%360/360*160-80}%`),k=z(i,o=>`${80-(o%360+360)%360/360*160}%`),E=z(i,o=>{const l=Math.abs(Math.sin(o*Math.PI/180));return Math.max(0,(l-.35)/.65)*.3}),b=()=>{p.current?.stop?.(),p.current=null};L.useEffect(()=>{if(f||g.current)return;let o=!1;i.set(-360);const l=F(i,0,{duration:.9,ease:[.16,1,.3,1]});return p.current=l,l.then(()=>{o||g.current||(p.current=F(i,[0,-14,14,0],{duration:4.5,repeat:1/0,ease:"easeInOut"}))}),()=>{o=!0,b()}},[f,i]);const v=o=>{const l=i.get();if(f){const y=Math.round(l/180)*180;p.current=F(i,y,{duration:.2,ease:"easeOut"});return}const d=l+o*.35,D=Math.round(d/180)*180;p.current=F(i,D,{type:"spring",velocity:o,stiffness:58,damping:13.5,mass:1})},j=o=>{g.current=!0,b(),o.currentTarget.setPointerCapture?.(o.pointerId),m.current={pointerId:o.pointerId,startX:o.clientX,startRot:i.get(),samples:[{t:o.timeStamp,x:o.clientX}]}},_=o=>{const l=m.current;!l||l.pointerId!==o.pointerId||(i.set(l.startRot+(o.clientX-l.startX)*.55),l.samples.push({t:o.timeStamp,x:o.clientX}),l.samples.length>5&&l.samples.shift())},w=o=>{const l=m.current;if(!l||l.pointerId!==o.pointerId)return;m.current=null;const d=l.samples[0],D=l.samples[l.samples.length-1],y=D.t-d.t,R=y>0?(D.x-d.x)*.55*1e3/y:0;v(R)},M=o=>{if(o.key!=="ArrowLeft"&&o.key!=="ArrowRight")return;o.preventDefault(),g.current=!0,b();const l=o.key==="ArrowRight"?30:-30;p.current=F(i,i.get()+l,{duration:.15,ease:"easeOut"})},A={backfaceVisibility:"hidden",WebkitBackfaceVisibility:"hidden"};return a.jsx("div",{role:"img","aria-label":c,tabIndex:0,onPointerDown:j,onPointerMove:_,onPointerUp:w,onPointerCancel:w,onKeyDown:M,className:"inline-flex cursor-grab select-none items-center justify-center outline-none focus-visible:ring-2 focus-visible:ring-oai-brand/60 rounded-full active:cursor-grabbing",style:{perspective:900,touchAction:"pan-y"},children:a.jsxs("div",{className:"relative",style:{transform:"rotateX(-8deg)",transformStyle:"preserve-3d"},children:[a.jsxs(C.div,{className:"relative",style:{rotateY:i,transformStyle:"preserve-3d",width:r,height:r},children:[[-3,-1.5,0,1.5,3].map(o=>a.jsx("div",{"aria-hidden":!0,className:"absolute inset-0 rounded-full",style:{transform:`translateZ(${o}px)`,background:u.rim[1]}},o)),a.jsxs("div",{className:"absolute inset-0 overflow-hidden rounded-full",style:{...A,transform:`translateZ(${he/2}px)`},children:[a.jsx(Ze,{badgeId:e,tier:t,locked:n,size:"fill",className:"brightness-105 saturate-[1.08]"}),a.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{background:"radial-gradient(circle at 30% 20%, rgba(255,255,255,0.45), rgba(255,255,255,0) 42%), linear-gradient(172deg, rgba(255,255,255,0.14) 0%, rgba(255,255,255,0) 38%, rgba(0,0,0,0.08) 100%)",boxShadow:"inset 0 3px 7px rgba(255,255,255,0.5), inset 0 -3px 8px rgba(0,0,0,0.15)"}}),a.jsx(C.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0",style:{x:N,background:"linear-gradient(105deg, transparent 34%, rgba(255,255,255,0.5) 50%, transparent 66%)"}}),a.jsx(C.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{opacity:E,background:"rgba(8, 12, 10, 0.9)"}})]}),a.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center gap-1 overflow-hidden rounded-full px-6 text-center",style:{...A,transform:`rotateY(180deg) translateZ(${he/2}px)`,background:`linear-gradient(145deg, ${u.face[0]}, ${u.face[1]})`,boxShadow:`inset 0 0 0 6px ${u.rim[1]}, inset 0 0 0 7.5px rgba(255,255,255,0.22), inset 0 3px 7px rgba(255,255,255,0.4), inset 0 -4px 12px rgba(0,0,0,0.22)`},children:[a.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{background:"repeating-radial-gradient(circle at 50% 50%, rgba(255,255,255,0.06) 0px, rgba(255,255,255,0.06) 1px, transparent 1px, transparent 4px)"}}),x?a.jsx(x,{"aria-hidden":!0,size:Math.round(r*.62),strokeWidth:1.1,color:u.glyph,className:"pointer-events-none absolute opacity-[0.13]",style:{filter:"drop-shadow(0 1px 0 rgba(255,255,255,0.3)) drop-shadow(0 -1px 0 rgba(0,0,0,0.35))"}}):null,a.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{background:"radial-gradient(circle at 70% 20%, rgba(255,255,255,0.4), rgba(255,255,255,0) 44%), linear-gradient(188deg, rgba(255,255,255,0.12) 0%, rgba(255,255,255,0) 38%, rgba(0,0,0,0.10) 100%)"}}),s.map((o,l)=>a.jsx("div",{className:`font-mono tabular-nums ${l===0?"text-[10px] uppercase tracking-[0.18em]":l===1?"text-lg font-bold":"text-[11px]"}`,style:{color:u.glyph,textShadow:"0 1px 0 rgba(255,255,255,0.28), 0 -1px 0 rgba(0,0,0,0.3)"},children:o},`${l}-${o}`)),a.jsx(C.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0",style:{x:k,background:"linear-gradient(105deg, transparent 34%, rgba(255,255,255,0.45) 50%, transparent 66%)"}}),a.jsx(C.div,{"aria-hidden":!0,className:"pointer-events-none absolute inset-0 rounded-full",style:{opacity:E,background:"rgba(8, 12, 10, 0.9)"}})]})]}),a.jsx("div",{"aria-hidden":!0,className:"absolute left-1/2 h-3 w-3/5 rounded-[100%] bg-black/20 blur-md dark:bg-black/45",style:{bottom:-20,transform:"translateX(-50%)"}})]})})}function Ae(e){if(!e)return null;const t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleDateString():null}function Vt(e){const t=Number(e);return!Number.isSafeInteger(t)||t<1?null:String(t).padStart(6,"0")}function Tt(e,t,n){if(t?.scope!=="cloud"||!n)return null;const r=Number(e?.serials?.[n]);return Number.isSafeInteger(r)&&r>=1?r:null}function $t({badge:e}){return a.jsx("div",{className:"flex items-center gap-1",children:Je.map((t,n)=>{const r=(e.tier||0)>=n+1,s=Ae(e.achieved?.[t]),c=T[t];return a.jsx("span",{title:s?`${h(`achievements.tier.${t}`)} · ${s}`:h(`achievements.tier.${t}`),className:"inline-flex h-2 w-8 rounded-full",style:r?{background:`linear-gradient(120deg, ${c.rim[0]} 0%, ${c.ring} 55%, ${c.rim[1]} 100%)`,boxShadow:"inset 0 1px 1px rgba(255,255,255,0.4), 0 0 0 1px rgba(10,15,12,0.05)"}:void 0,children:!r&&a.jsx("span",{className:"h-full w-full rounded-full bg-oai-gray-200 dark:bg-oai-gray-800"})},t)})})}function ge({badge:e,onClose:t}){const n=je.get(e.id),r=h(U(e.id,"name")),s=(e.tier||0)>=1,c=s?le(e.tier):null,i=Ae(s?e.achieved?.[c]||(ce(e)?new Date(ce(e)).toISOString():null):null),f=ue(n?.format,e.metric_value),m=tt(e),p=e.tier<4?le((e.tier||0)+1):null,g=Tt(e,n,c),u=Vt(g),x=u?[h("achievements.modal.achieved_label"),h("achievements.modal.issue_number",{number:u}),i||r]:[s?h("achievements.modal.achieved_label"):h("achievements.modal.locked"),s?f:"···",s&&i?i:r];return a.jsxs("div",{className:"flex flex-col items-center px-6 pb-6 pt-5 text-center",children:[a.jsxs("div",{className:"flex w-full items-start justify-between gap-3",children:[a.jsxs("div",{className:"min-w-0 flex-1 text-left",children:[a.jsx("h2",{className:"truncate text-lg font-semibold tracking-tight text-oai-black dark:text-white",children:r}),a.jsx("p",{className:"mt-0.5 text-xs text-oai-gray-500 dark:text-oai-gray-400",children:h(U(e.id,"desc"))})]}),a.jsx("button",{type:"button",onClick:t,"aria-label":h("achievements.modal.close"),className:"shrink-0 rounded-md p-1.5 text-oai-gray-400 transition-colors hover:bg-oai-gray-100 hover:text-oai-gray-700 dark:hover:bg-oai-gray-900 dark:hover:text-oai-gray-200",children:a.jsx(Ie,{size:16})})]}),a.jsx("div",{className:"mt-5 mb-7",children:a.jsx(Mt,{badgeId:e.id,tier:e.tier,locked:!s,backLines:x,label:h("achievements.modal.coin_aria",{name:r})})}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"rounded-full px-2.5 py-0.5 text-[11px] font-semibold uppercase tracking-wide",style:s?{background:`linear-gradient(120deg, ${T[c].rim[0]} 0%, ${T[c].ring} 55%, ${T[c].rim[1]} 100%)`,color:T[c].glyph,textShadow:"0 1px 0 rgba(255,255,255,0.35)",boxShadow:"inset 0 1px 1px rgba(255,255,255,0.4), 0 0 0 1px rgba(10,15,12,0.06)"}:{background:"rgba(128,134,130,0.75)",color:"rgba(250,250,250,0.95)"},children:s?h(`achievements.tier.${c}`):h("achievements.modal.locked")}),s&&i?a.jsx("span",{className:"text-xs tabular-nums text-oai-gray-500 dark:text-oai-gray-400",children:i}):null]}),a.jsxs("dl",{className:"mt-5 w-full space-y-3 border-t border-oai-gray-200/70 pt-4 text-left dark:border-oai-gray-800/60",children:[a.jsxs("div",{className:"flex items-baseline justify-between gap-3 text-sm",children:[a.jsx("dt",{className:"text-oai-gray-500 dark:text-oai-gray-400",children:h("achievements.modal.value_label")}),a.jsx("dd",{className:"font-mono font-semibold tabular-nums text-oai-black dark:text-white",children:f})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-baseline justify-between gap-3 text-xs text-oai-gray-500 dark:text-oai-gray-400",children:[a.jsx("span",{children:e.tier>=4?h("achievements.modal.max_tier"):h("achievements.modal.progress_to_next",{tier:h(`achievements.tier.${p}`)})}),e.tier<4&&e.next_threshold!=null?a.jsxs("span",{className:"font-mono tabular-nums",children:[f," ",e.lower_is_better?"→":"/"," ",ue(n?.format,e.next_threshold)]}):null]}),a.jsx("div",{className:"mt-1.5 h-1.5 w-full overflow-hidden rounded-full bg-oai-gray-200 dark:bg-oai-gray-800",children:a.jsx("div",{className:"h-full rounded-full transition-[width] duration-500",style:{width:`${Math.round((e.tier>=4?1:m)*100)}%`,background:s?`linear-gradient(90deg, ${T[c].rim[0]} 0%, ${T[c].ring} 55%, ${T[c].rim[1]} 100%)`:"rgba(128,134,130,0.75)",boxShadow:s?"inset 0 1px 1px rgba(255,255,255,0.35)":void 0}})})]}),a.jsxs("div",{className:"flex items-center justify-between gap-3 text-xs text-oai-gray-500 dark:text-oai-gray-400",children:[a.jsx("span",{children:h("achievements.modal.tier_history")}),a.jsx($t,{badge:e})]})]})]})}const xe=ye("relative w-full max-w-[380px] flex flex-col","rounded-2xl bg-white dark:bg-oai-gray-950","shadow-[0_20px_60px_-20px_rgba(0,0,0,0.25)] dark:shadow-[0_20px_60px_-10px_rgba(0,0,0,0.65)]","ring-1 ring-oai-gray-200 dark:ring-oai-gray-800 overflow-hidden","dark:border-t dark:border-white/[0.08]");function Ht({badge:e,onClose:t}){const n=De(),r=!!e;return L.useEffect(()=>{if(!n||!r)return;const s=c=>{c.key==="Escape"&&(c.stopPropagation(),t?.())};return window.addEventListener("keydown",s,!0),()=>window.removeEventListener("keydown",s,!0)},[n,r,t]),r?n?a.jsxs("div",{className:"fixed inset-0 z-[120] flex items-center justify-center p-4",children:[a.jsx("div",{className:"absolute inset-0 bg-black/40 backdrop-blur-[2px]",onClick:t,"aria-hidden":!0}),a.jsx("div",{className:xe,children:a.jsx(ge,{badge:e,onClose:t})})]}):a.jsx(nt,{open:!0,onOpenChange:s=>{s||t?.()},children:a.jsxs(rt,{children:[a.jsx(at,{className:"cost-modal-backdrop z-[110]"}),a.jsx(st,{className:"fixed inset-0 z-[120] flex items-center justify-center p-4",children:a.jsxs(it,{className:ye("cost-modal-popup",xe),children:[a.jsx(ot,{render:a.jsx("h2",{className:"sr-only"}),children:h(U(e.id,"name"))}),a.jsx(ge,{badge:e,onClose:t})]})})]})}):null}export{Ht as BadgeDetailModal,Tt as currentBadgeIssueNumber,Ht as default,Vt as formatIssueNumber};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as _,j as I}from"./__vite-browser-external-Bq8nj-JV.js";import{r as Wt,c as Zt,d as mt,e as Jt}from"./use-pet-settings-C5MzWHE7.js";import{T as j,r as $,c as u,a as et,l as H,b as y,d as U,s as rt,e as T,p as Yt,h as pt,f as te,S as ee,t as at,g as jt,i as se,j as ne,k as ie,C as oe,m as xt,n as re}from"./skins-Mc0sI20C.js";function nt(t,e=.55,s=.62){const n=(t%360+360)%360,i=(1-Math.abs(2*s-1))*e,r=i*(1-Math.abs(n/60%2-1)),o=s-i/2,[l,c,p]=n<60?[i,r,0]:n<120?[r,i,0]:n<180?[0,i,r]:n<240?[0,r,i]:n<300?[r,0,i]:[i,0,r],h=f=>Math.round((f+o)*255).toString(16).padStart(2,"0");return`#${h(l)}${h(c)}${h(p)}`}function ae(t,e,s,n,i=1){const r=t.phase+e*t.speed*j,o=Math.cos(t.tilt),l=Math.sin(t.tilt),c=Math.sqrt(Math.max(0,1-t.k*t.k)),p=64,h=t.sweep*j;let f="",M="",k=null;for(let P=0;P<=p;P++){const x=r+P/p*h,m=Math.cos(x),g=Math.sin(x),d=t.a*(m*o+g*-l*t.k)+t.cx,C=t.a*(m*l+g*o*t.k)+t.cy,R=t.a*g*c<0,a=$(d*s),O=$(C*s),E=R!==k?"M":"L";R?M+=`${E}${a} ${O}`:f+=`${E}${a} ${O}`,k=R}const A=Math.cos(t.tilt)*t.a*s,w=Math.sin(t.tilt)*t.a*s;return{id:n,front:f,back:M,width:t.width*s,opacity:i,grad:{x1:$(t.cx*s-A),y1:$(t.cy*s-w),x2:$(t.cx*s+A),y2:$(t.cy*s+w),stops:[nt(t.hue),nt(t.hue+t.hueSpan*.5),nt(t.hue+t.hueSpan)]}}}const D=et(659918),gt=Array.from({length:6},(t,e)=>({a:1.3+D()*.1,k:.05+D()*.4,tilt:e/6*Math.PI+D()*.5,speed:3+D()*.7,phase:D()*j,sweep:.6+D()*.25,hue:e*360/6+D()*30,hueSpan:60+D()*60,width:.05+D()*.012,cx:0,cy:.1})),ce=Array.from({length:4},(t,e)=>({a:.78+e*.2,k:.05+e*.02,tilt:-.62+e*.05,speed:.3,phase:.06*e,sweep:.4,hue:95+e*62,hueSpan:100,width:.05,cx:0,cy:-.12})),Mt=[-.557,-.013,.532],bt=.165,At=1.25,wt=et(48879),le=Array.from({length:5},(t,e)=>({birth:e*.2,angle:wt()*j,rho:.58+wt()*.18}));function he(t,e){const s=[];for(const n of le){const i=t-n.birth;if(i<0||i>.62)continue;const r=n.rho*Math.pow(.75,i*10),o=n.angle+i*100*Math.PI/180;s.push({x:Math.cos(o)*r*e,y:Math.sin(o)*r*e,r:(.04+.028*u(i/.55))*e,depth:u(1-r/.8),opacity:u(i/.06)*u((.62-i)/.08)})}return s}const kt=et(49383),pe=Array.from({length:4},(t,e)=>{const s=e-1.5;return{a:.85*(1+s*.03),k:.15/.85*(1+s*.16),tilt:34*Math.PI/180+s*.035,speed:210/360,phase:-e*.045+kt()*.012,sweep:.34,hue:e*85+kt()*20,hueSpan:80,width:.095,cx:0,cy:0}}),ue=.129,de="#2496e8",fe=-42,It=1.003,ye=.15,me=1.14,xe=.054,ut=15.46,ct=.186,lt=.412,st={yaw:28.49,pitch:28.62,roll:-13},J=t=>t*Math.PI/180;function tt(t,e,s){const n=Math.cos(s),i=Math.sin(s);return[[t[0]*n+e[0]*i,t[1]*n+e[1]*i,t[2]*n+e[2]*i],[e[0]*n-t[0]*i,e[1]*n-t[1]*i,e[2]*n-t[2]*i]]}function Ht(t,e,s=ut){let n=[0,0,1],i=[1,0,0],r=[0,1,0];[n,i]=tt(n,i,J(t.yaw)),[r,n]=tt(r,n,J(t.pitch)),[i,r]=tt(i,r,J(t.roll));const o=l=>{const[c,p]=tt(n,i,J(s*l));return{x:c[0]*e,y:c[1]*e,a:p[0],b:p[1],c:r[0],d:r[1],depth:c[2]}};return[o(-1),o(1)]}const Pt=et(24301),Et=(()=>{const t=[];let e=1.4;for(;e<900;)t.push(e),e+=1.9+Pt()*2.7,Pt()<.18&&(t.push(e),e+=.24);return t})(),ge=.18;function Me(t){for(let e=0;e<Et.length;e++){const s=Et[e];if(t<s)break;const n=(t-s)/ge;if(n>=0&&n<=1)return n<.45?1-n/.45:(n-.45)/.55}return 1}function be(t,e={}){const{wander:s=1,blink:n=!0,float:i=!0}=e;return{dYaw:(H(t,11.3,.4)*5.5+H(t,3.7,2.1)*1.6)*s,dPitch:(H(t,9.1,1.3)*4.2+H(t,4.3,.7)*1.3)*s,dRoll:H(t,13.7,3.2)*2.2*s,lid:n?Me(t):1,driftX:i?H(t,7.9,1.9)*.006:0,driftY:i?H(t,5.3,.3)*.007:0,breath:i?1+Math.sin(t/3.4*Math.PI*2)*.005:1}}function Ae(t){return .06+.94*u(t)}const L=(t,e,s=0,n=1)=>({w:t,h:e,tilt:s,open:n}),F=(t,e,s=0,n=1)=>[L(t,e,s,n),L(t,e,-s,n)],Xt=[{id:"neutre",gaze:{...st},split:ut,eyes:[L(ct,lt),L(ct,lt)]},{id:"attentif",gaze:{yaw:4,pitch:5,roll:-4},split:16,eyes:F(.21,.44)},{id:"surpris",gaze:{yaw:3,pitch:-3,roll:0},split:19,eyes:F(.45,.47)},{id:"excite",gaze:{yaw:6,pitch:-14,roll:0},split:19.5,eyes:F(.4,.56,-10)},{id:"heureux",gaze:{yaw:5,pitch:9,roll:0},split:17,eyes:F(.27,.17,14)},{id:"hilare",gaze:{yaw:4,pitch:14,roll:0},split:18,eyes:F(.34,.13,20)},{id:"colere",gaze:{yaw:3,pitch:7,roll:0},split:17,eyes:F(.34,.15,30)},{id:"triste",gaze:{yaw:3,pitch:-13,roll:0},split:16,eyes:F(.22,.4,-28)},{id:"effraye",gaze:{yaw:2,pitch:-20,roll:0},split:20.5,eyes:F(.4,.6)},{id:"mefiant",gaze:{yaw:12,pitch:6,roll:-6},split:16,eyes:[L(.21,.4),L(.22,.15)]},{id:"confus",gaze:{yaw:-14,pitch:3,roll:8},split:16.5,eyes:[L(.2,.44,-18),L(.28,.17,14)]},{id:"curieux",gaze:{yaw:16,pitch:-9,roll:-15},split:16.5,eyes:[L(.24,.46,-8),L(.2,.38,-8)]},{id:"fier",gaze:{yaw:5,pitch:17,roll:0},split:17,eyes:F(.3,.15,18)},{id:"timide",gaze:{yaw:-19,pitch:-14,roll:-7},split:14,eyes:F(.17,.3)},{id:"blase",gaze:{yaw:-22,pitch:2,roll:0},split:16,eyes:F(.3,.12)},{id:"somnolent",gaze:{yaw:6,pitch:-9,roll:-3},split:16,eyes:F(.2,.42,0,.42)}],Ot=new Map(Xt.map(t=>[t.id,t])),zt=(t,e,s)=>({w:y(t.w,e.w,s),h:y(t.h,e.h,s),tilt:y(t.tilt??0,e.tilt??0,s),open:y(t.open,e.open,s)});function we(t,e,s){return{id:e.id,gaze:{yaw:y(t.gaze.yaw,e.gaze.yaw,s),pitch:y(t.gaze.pitch,e.gaze.pitch,s),roll:y(t.gaze.roll,e.gaze.roll,s)},split:y(t.split,e.split,s),eyes:[zt(t.eyes[0],e.eyes[0],s),zt(t.eyes[1],e.eyes[1],s)]}}const X=(t,e)=>[{w:t,h:e,open:1},{w:t,h:e,open:1}];function S(t={}){return{sil:U(1),offX:0,offY:0,gaze:{...st},split:ut,eyes:X(ct,lt),eyeAlpha:1,bodyAlpha:1,dots:[],arcs:[],notif:null,dotsBehind:!1,...t}}const Gt=-.1875,ke=Yt(pt(0,-.505,.132,0,.13,.075),0,Gt),Ie=Yt(pt(0,-.2535,.1345,0,.2535,.1345),0,0),Pe=(t={})=>({radii:[...ke],rot:0,cx:0,cy:Gt,sx:1,sy:1,...t}),Ee=(t={})=>({radii:[...Ie],rot:0,cx:0,cy:0,sx:1,sy:1,...t}),Oe=te(pt(0,0,.118,0,.172,.012)),Rt=.213;function _t(t){return rt("triangle",{rot:t,cx:-Rt*Math.sin(t),cy:Rt*Math.cos(t)})}function St(t,e){const s=((t-e*.5)/1.5%1+1)%1,n=s<.5?.5-.5*Math.cos(s*j):0;return u(n*2)}const Ut=[{id:"idle",duration:2.4,morph:.45,blinkIn:!1,baseFace:!0,baseBody:!0,pose:()=>S()},{id:"thinking",duration:2.6,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!0,pose:t=>{const e=St(t,1),s=.3+.7*T.easeOutCubic(u(t/.3));return S({sil:U(bt*(1+(At-1)*e),{cx:Mt[1]}),eyeAlpha:0,dots:[0,2].map(n=>{const i=St(t,n);return{x:Mt[n]*s,y:0,r:bt*(1+(At-1)*i),opacity:.55+.45*i}})})}},{id:"wink",duration:1.6,morph:.3,blinkIn:!0,baseFace:!1,baseBody:!0,pose:()=>S({gaze:{yaw:-5.37,pitch:4.55,roll:6.7},split:16.25,eyes:[{w:.236,h:.464,open:1},{w:.447,h:.089,open:1}]})},{id:"wide",duration:1.8,morph:.55,blinkIn:!0,baseFace:!1,baseBody:!0,pose:()=>S({gaze:{yaw:6.92,pitch:-21.96,roll:11.6},split:18.43,eyes:X(.356,.875)})},{id:"alert",duration:2.4,minDuration:2,morph:.45,baseFace:!1,baseBody:!1,blinkIn:!1,pose:t=>{const e=u(t/1.5),s=T.easeInOutCubic(e)*.82-.087,n=t>1.6?u((t-1.6)/.4):0,i=s*(1-n)+.1*n,r=Math.sin(t*2.5*j)*.005,o=17.7*Math.PI/180;return S({sil:Ee({rot:o,cx:i,cy:-.325-r}),eyeAlpha:0,dots:[{x:i-Math.sin(o)*.58,y:-.325+Math.cos(o)*.58+r*2.8,r:.118,d:Oe,rot:o*180/Math.PI,opacity:1}]})}},{id:"notify",duration:2.2,morph:.5,blinkIn:!0,baseFace:!1,baseBody:!0,pose:t=>{const e=u(t/.45),s=1+(me-1)*Math.sin(e*Math.PI)*(1-e*.35),n=ye*(e<1?s:1),i=fe*Math.PI/180;return S({gaze:{yaw:-21.94,pitch:-5.82,roll:-12.2},split:18.89,eyes:X(.505,.498),notif:{x:Math.cos(i)*It,y:Math.sin(i)*It,r:n,notch:n+xe}})}},{id:"exclaim",duration:2,morph:.45,baseFace:!1,baseBody:!1,blinkIn:!1,pose:()=>S({sil:Pe(),eyeAlpha:0,dots:[{x:-.012,y:.526,r:.113,opacity:1}]})},{id:"sleep",duration:2.4,morph:.5,baseFace:!1,baseBody:!1,blinkIn:!1,pose:t=>S({sil:U(.1585,{cy:.11+Math.sin(t*(j/.6))*.19}),eyeAlpha:0})},{id:"egg",duration:1.8,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!0,pose:()=>S({sil:rt("egg"),gaze:{yaw:19.97,pitch:26.01,roll:-17.1},split:11.07,eyes:X(.164,.385)})},{id:"hexagon",duration:1.6,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!0,pose:()=>S({sil:rt("hexagon"),gaze:{yaw:23.11,pitch:24.42,roll:-13.3},split:13.37,eyes:X(.177,.411)})},{id:"play",duration:2,morph:.5,baseFace:!1,baseBody:!1,blinkIn:!0,pose:t=>{const e=u(t/.35)*u((2.2-t)/.5);return S({sil:_t(0),gaze:{yaw:12,pitch:-8,roll:-6},split:15,eyes:X(.18,.34),arcs:ce.map((s,n)=>({id:`sw${n}`,seed:{...s,cx:.45-t*.42},t,opacity:e}))})}},{id:"orbit",duration:3.4,minDuration:2.5,morph:.6,baseFace:!1,baseBody:!1,blinkIn:!1,pose:t=>{const e=T.easeInOutCubic(u(t/.35)),s=-j*1.25*t*e,n=T.easeInOutCubic(u((t-1.6)/.9)),i=_t(s),r=U(1,{rot:s}),o={radii:i.radii.map((c,p)=>c+(r.radii[p]-c)*n),rot:s,cx:i.cx*(1-n),cy:i.cy*(1-n),sx:1,sy:1},l=u(t/.8)*u((3.6-t)/.9);return S({sil:o,gaze:{yaw:st.yaw+Math.sin(t*6.5)*65*(1-n),pitch:-4+n*32,roll:-13},eyes:X(.18,.34+n*.07),arcs:gt.map((c,p)=>({id:`rg${p}`,seed:c,t,opacity:l*u((t-p*.13)/.3)}))})}},{id:"swirl",duration:1.3,minDuration:1.3,morph:.3,baseFace:!0,baseBody:!0,blinkIn:!0,pose:t=>S({arcs:gt.slice(0,3).map((e,s)=>({id:`sw${s}`,seed:e,t,opacity:u((t-s*.06)/.14)*u((1.22-t)/.34)}))})},{id:"burst",duration:2.6,minDuration:2.4,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!1,pose:t=>{const e=1-.834*T.easeOutQuint(u(t/.7)),s=T.easeOutQuint(u((t-1.7)/.7));return S({sil:U(e+(1-e)*s),eyeAlpha:u((t-1.85)/.4),dots:he(t,1),dotsBehind:!0})}},{id:"comet",duration:2.4,minDuration:2.4,morph:.45,baseFace:!1,baseBody:!1,blinkIn:!1,pose:t=>{const e=1-(1-ue)*T.easeOutQuint(u(t/.55)),s=T.easeOutQuint(u((t-1.85)/.6)),n=u((t-.15)/.25)*u((1.95-t)/.3);return S({sil:U(e+(1-e)*s,{cy:Math.sin(u(t/1.7)*Math.PI)*.035}),eyeAlpha:u((t-2)/.35),arcs:pe.map((i,r)=>({id:`cm${r}`,seed:i,t,opacity:n}))})}}],Q=new Map(Ut.map(t=>[t.id,t])),Y=100,Tt=5.5+1.6,vt=4.2+1.3,ze=.006,Re=.007;function Ft(t,e,s){const n=[],i=Ht(t.gaze,Y,t.split);for(let r=0;r<2;r++){const o=i[r];if(o.depth<=.02)continue;const l=t.eyes[r],c=(l.tilt??0)*Math.PI/180,p=Math.cos(c),h=Math.sin(c),f=o.a*p+o.c*h,M=o.b*p+o.d*h,k=-o.a*h+o.c*p,A=-o.b*h+o.d*p,w=Math.max(l.w*Y,.01)/2,P=Math.max(l.h*Y,.01)/2,x=Math.min(w,P),m=P>w,g=m?P-x:w-x,d=jt(s,Math.atan2(o.y,o.x)-e.rot);n.push({x:o.x*d,y:o.y*d,ax:(m?k:f)*g,ay:(m?A:M)*g,r:x,m:[f,M,k,A]})}return n}function _e(t,e,s,n,i){const r=n-e,o=i-s,l=r*r+o*o;let c=1/0,p=0,h=0;for(let M=0;M<t.length;M++){const k=t[M];let A=l>0?((k.x-e)*r+(k.y-s)*o)/l:0;A=A<0?0:A>1?1:A;const w=e+A*r-k.x,P=s+A*o-k.y,x=w*w+P*P;x<c&&(c=x,p=w,h=P)}const f=Math.sqrt(c);return{d:f,ux:f>1e-9?p/f:0,uy:f>1e-9?h/f:0}}const Se=Math.hypot(ze,Re)*Y;function Bt(t,e,s,n){let i=1/0,r=0,o=0;for(const l of e){const c=l.x+s,p=l.y+n,h=_e(t,c-l.ax,p-l.ay,c+l.ax,p+l.ay),[f,M,k,A]=l.m,w=l.r*Math.hypot(f*h.ux+M*h.uy,k*h.ux+A*h.uy)+Se;h.d-w<i&&(i=h.d-w,r=h.ux,o=h.uy)}return{marge:i,ux:r,uy:o}}const $t=12,Te=8;function ve(t){if(!t.length)return{x:0,y:0};const e=(x,m)=>{let g=1/0;for(const d of t)g=Math.min(g,Bt(d.contour,d.empreintes,x,m).marge);return g};let s=1/0;for(const x of t)s=Math.min(s,Bt(x.calContour,x.reference,0,0).marge);let n=0,i=0;const r=t[0].empreintes;for(const x of r)n-=x.x/r.length,i-=x.y/r.length;const o=Math.max(.35*Y,Math.hypot(n,i)*1.25);s=Math.min(s,e(n,i));const l=e(0,0);if(l>=s&&l>=0)return{x:0,y:0};const c=Math.max(s,0);let p=0,h=0,f=1/0,M=0,k=0,A=l;for(let x=0;x<$t;x++){const m=x/$t*Math.PI*2,g=Math.cos(m),d=Math.sin(m);if(e(g*o,d*o)<c){for(const R of[.3,.6,1]){const a=e(g*o*R,d*o*R);a>A&&(A=a,M=g*o*R,k=d*o*R)}continue}let C=0,v=o;for(let R=0;R<Te;R++){const a=(C+v)/2;e(g*a,d*a)>=c?v=a:C=a}v<f&&(f=v,p=g*v,h=d*v)}const w=f===1/0?M:p,P=f===1/0?k:h;return{x:+(w/Y).toFixed(6),y:+(P/Y).toFixed(6)}}function Fe(t,e,s){return t.baseFace&&s?{gaze:s.gaze,split:s.split,eyes:s.eyes}:{gaze:e.gaze,split:e.split,eyes:e.eyes}}function Be(t){const e=n=>JSON.stringify([n.gaze,n.split,n.eyes,n.sil.rot,n.sil.cx,n.sil.cy,n.sil.sx,n.sil.sy]);if(e(t.pose(0))===e(t.pose(t.duration)))return[0];const s=3;return Array.from({length:s},(n,i)=>i/(s-1)*t.duration)}function $e(t,e,s){const n=[];for(const i of Be(t)){const r=t.pose(i),o=at({...r.sil,radii:e},Y),l=at(r.sil,Y),c=Fe(t,r,s),p=[];for(const h of[-Tt,Tt])for(const f of[-vt,vt])p.push({...c,gaze:{yaw:c.gaze.yaw+h,pitch:c.gaze.pitch+f,roll:c.gaze.roll}});for(const h of p)n.push({empreintes:Ft(h,r.sil,e),reference:Ft(h,r.sil,r.sil.radii),contour:o,calContour:l})}return ve(n)}const it={x:0,y:0},ht=(t,e)=>`${t}|${e??""}`;function Ce(){return new Map(ee.map(t=>{const e=new Map;for(const s of Ut){if(!s.baseBody)continue;const n=s.baseFace?[null,...Xt]:[null];for(const i of n)e.set(ht(s.id,i?.id??null),$e(s,t.radii,i))}return[t.radii,e]}))}const Le=Ce();function Ct(t,e,s){if(!t)return it;const n=Le.get(t);return n?n.get(ht(e,s))??n.get(ht(e,null))??it:it}const ot={yaw:0,pitch:0,mix:0,spin:0,wander:1},Ne=(t,e,s)=>({yaw:y(t.yaw,e.yaw,s),pitch:y(t.pitch,e.pitch,s),mix:y(t.mix,e.mix,s),spin:y(t.spin,e.spin,s),wander:y(t.wander,e.wander,s)}),Lt=(t,e,s)=>({w:y(t.w,e.w,s),h:y(t.h,e.h,s),open:y(t.open,e.open,s),tilt:y(t.tilt??0,e.tilt??0,s)});function Nt(t,e,s){const n=1-s;return{sil:ie(t.sil,e.sil,s),offX:y(t.offX,e.offX,s),offY:y(t.offY,e.offY,s),gaze:{yaw:y(t.gaze.yaw,e.gaze.yaw,s),pitch:y(t.gaze.pitch,e.gaze.pitch,s),roll:y(t.gaze.roll,e.gaze.roll,s)},split:y(t.split,e.split,s),eyes:[Lt(t.eyes[0],e.eyes[0],s),Lt(t.eyes[1],e.eyes[1],s)],eyeAlpha:y(t.eyeAlpha,e.eyeAlpha,s),bodyAlpha:y(t.bodyAlpha,e.bodyAlpha,s),dots:[...t.dots.map(i=>({...i,opacity:i.opacity*n})),...e.dots.map(i=>({...i,opacity:i.opacity*s}))],arcs:[...t.arcs.map(i=>({...i,id:`a${i.id}`,opacity:i.opacity*n})),...e.arcs.map(i=>({...i,id:`b${i.id}`,opacity:i.opacity*s}))],notif:s<.5?t.notif:e.notif,dotsBehind:s<.5?t.dotsBehind:e.dotsBehind}}class G{scale;cur;prev=null;departFige=null;tCur=0;tPrev=0;blinkAt=-10;pts=[];shape=null;shapePrev=null;shapeAt=-10;expr=null;exprPrev=null;exprAt=-10;look=ot;lookPrev=ot;lookAt=-10;lookMorph=.24;static SHAPE_MORPH=.45;static LOOK_MORPH=.24;constructor(e=100,s="idle",n=null,i=null){this.scale=e,this.cur=s,this.shape=n,this.expr=i}setExpression(e,s=0){e!==this.expr&&(this.exprPrev=this.expr,this.expr=e,this.exprAt=s)}exprAtTime(e){const s=this.expr,n=this.exprPrev;if(!s||!n)return s;const i=(e-this.exprAt)/G.SHAPE_MORPH;return i>=1?s:we(n,s,T.easeOutQuint(u(i)))}setShape(e,s=0){e!==this.shape&&(this.shapePrev=this.shape,this.shape=e,this.shapeAt=s)}shapeAtTime(e){const s=this.shape,n=this.shapePrev;if(!s||!n)return s;const i=(e-this.shapeAt)/G.SHAPE_MORPH;if(i>=1)return s;const r=T.easeOutQuint(u(i));return s.map((o,l)=>y(n[l]??o,o,r))}setLook(e,s,n=G.LOOK_MORPH){e&&!Number.isFinite(e.yaw+e.pitch+e.mix+e.spin+e.wander)||(this.lookPrev=this.lookAtTime(s),this.look=e??ot,this.lookAt=s,this.lookMorph=n)}lookAtTime(e){const s=(e-this.lookAt)/this.lookMorph;return s>=1?this.look:Ne(this.lookPrev,this.look,T.easeOutQuint(u(s)))}posed(e,s,n,i){let r=e.pose(s);return e.baseBody&&n&&(r={...r,sil:{...r.sil,radii:n}}),e.baseFace&&i&&(r={...r,gaze:i.gaze,split:i.split,eyes:i.eyes}),r}decalageAtTime(e,s){const n=(r,o,l,c)=>{if(l===c)return c;const p=(e-r)/o;if(p>=1)return c;const h=T.easeOutQuint(u(p));return{x:y(l.x,c.x,h),y:y(l.y,c.y,h)}},i=r=>n(this.exprAt,G.SHAPE_MORPH,Ct(r,s,this.exprPrev?.id??null),Ct(r,s,this.expr?.id??null));return n(this.shapeAt,G.SHAPE_MORPH,i(this.shapePrev),i(this.shape))}get state(){return this.cur}reset(e,s){this.cur=e,this.prev=null,this.departFige=null,this.tCur=s,this.tPrev=s,this.blinkAt=-10}origine(e,s,n){if(this.departFige)return this.departFige;if(!this.prev)return null;const i=Q.get(this.prev);return this.posed(i,Math.max(0,e-this.tPrev),s,n)}poseComposee(e){const s=Q.get(this.cur),n=this.shapeAtTime(e),i=this.exprAtTime(e),r=this.posed(s,Math.max(0,e-this.tCur),n,i),o=e-this.tCur;if(o>=s.morph)return r;const l=this.origine(e,n,i);return l?Nt(l,r,T.easeOutQuint(u(o/s.morph))):r}setState(e,s){if(e===this.cur)return;const n=Q.get(this.cur).morph,i=this.prev!==null&&s-this.tCur<n;this.departFige=i?this.poseComposee(s):null,this.prev=this.cur,this.tPrev=this.tCur,this.cur=e,this.tCur=s,Q.get(e)?.blinkIn&&(this.blinkAt=s)}sample(e){const s=this.scale,n=Q.get(this.cur),i=this.shapeAtTime(e),r=this.exprAtTime(e);let o=this.posed(n,Math.max(0,e-this.tCur),i,r),l=this.decalageAtTime(e,this.cur);const c=e-this.tCur,p=c<n.morph?this.origine(e,i,r):null;if(p){const b=T.easeOutQuint(u(c/n.morph));o=Nt(p,o,b);const N=this.prev;if(N){const z=this.decalageAtTime(e,N);l={x:y(z.x,l.x,b),y:y(z.y,l.y,b)}}}const h=o.eyeAlpha>.01,f=this.lookAtTime(e),M=be(e,{wander:h?f.wander:0,blink:h}),k={yaw:y(o.gaze.yaw,f.yaw,f.mix)+M.dYaw-f.spin,pitch:y(o.gaze.pitch,f.pitch,f.mix)+M.dPitch,roll:o.gaze.roll+M.dRoll},A=u((e-this.blinkAt)/.2),w=A<1?Math.abs(A*2-1):1,P=Math.min(M.lid,w),x=o.offX+M.driftX,m=o.offY+M.driftY,g={...o.sil,cx:o.sil.cx+x,cy:o.sil.cy+m,sy:o.sil.sy*M.breath},d=se(at(g,s,this.pts)),C=(b,N)=>jt(o.sil.radii,Math.atan2(N,b)-o.sil.rot),v=[];if(o.eyeAlpha>.01){const b=Ht(k,s,o.split);for(let N=0;N<2;N++){const z=b[N];if(z.depth<=.02)continue;const q=o.eyes[N],dt=C(z.x,z.y),ft=(q.tilt??0)*Math.PI/180,W=Math.cos(ft),Z=Math.sin(ft),Qt=z.a*W+z.c*Z,Vt=z.b*W+z.d*Z,Kt=-z.a*Z+z.c*W,qt=-z.b*Z+z.d*W,yt=Ae(Math.min(P,q.open));v.push({d:ne(q.w*s,q.h*s),matrix:`matrix(${$(Qt)},${$(Vt*yt)},${$(Kt)},${$(qt*yt)},${$(z.x*dt+(x+l.x)*s)},${$(z.y*dt+(m+l.y)*s)})`,alpha:o.eyeAlpha*u(z.depth/.12)})}}const R=o.dots.filter(b=>b.opacity>.01&&b.r>5e-4).map(b=>({...b,x:(b.x+x)*s,y:(b.y+m)*s,r:b.r*s})),a=o.notif?C(o.notif.x,o.notif.y):1,O=o.notif?(o.notif.x*a+x)*s:0,E=o.notif?(o.notif.y*a+m)*s:0,V=o.notif?{x:O,y:E,r:o.notif.r*s}:null,K=o.notif?{x:O,y:E,r:o.notif.notch*s}:null;return{bodyPath:d,bodyAlpha:o.bodyAlpha,eyes:v,dots:R,dotsBehind:o.dotsBehind,arcs:o.arcs.filter(b=>b.opacity>.01).map(b=>ae(b.seed,b.t,s,b.id,b.opacity)),notif:V,notch:K}}}const Dt=100,De=158,B=De,Ye=1e3/30,je=34;function He(){const[t,e]=_.useState(()=>typeof document>"u"?!1:document.documentElement.classList.contains("dark"));return _.useEffect(()=>{if(typeof MutationObserver!="function")return;const s=document.documentElement,n=new MutationObserver(()=>e(s.classList.contains("dark")));return n.observe(s,{attributes:!0,attributeFilter:["class"]}),()=>n.disconnect()},[]),t}function Xe(){const[t,e]=_.useState(()=>typeof document>"u"?!0:document.visibilityState!=="hidden");return _.useEffect(()=>{if(typeof document>"u")return;const s=()=>e(document.visibilityState!=="hidden");return document.addEventListener("visibilitychange",s),()=>document.removeEventListener("visibilitychange",s)},[]),t}function Ge(){const[t,e]=_.useState(()=>typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches);return _.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const s=window.matchMedia("(prefers-reduced-motion: reduce)"),n=i=>e(i.matches);return s.addEventListener("change",n),()=>s.removeEventListener("change",n)},[]),t}function Ke({state:t="idle-living",dragState:e=null,size:s=48,className:n="",leanX:i=0,shape:r=Zt,color:o="auto",paper:l=null}){const c=Jt(e==="running-left"||e==="running-right"?e:t),p=Ge(),h=Xe(),f=He(),M=l||(f?mt.dark:mt.light),k=oe.get(Wt(o,f)).hex,A=_.useId(),w=_.useMemo(()=>A.replace(/[^a-zA-Z0-9_-]/g,""),[A]),P=`bot-mask-${w}`,x=_.useRef(null);x.current===null&&(x.current=new G(Dt,c.state,xt.get(r)?.radii??null,Ot.get(c.expression)??null));const m=x.current,g=_.useRef(0),[d,C]=_.useState(()=>m.sample(0));_.useEffect(()=>{m.setShape(xt.get(r)?.radii??null,g.current)},[m,r]),_.useEffect(()=>{m.setExpression(Ot.get(c.expression)??null,g.current)},[m,c.expression]),_.useEffect(()=>{m.state!==c.state&&(m.setState(c.state,g.current),C(m.sample(g.current)))},[m,c.state]),_.useEffect(()=>{const a=Math.min(1,Math.abs(i));if(a<=0||!Q.get(c.state)?.baseFace){m.setLook(null,g.current);return}m.setLook({yaw:i*je,pitch:st.pitch,mix:a,spin:0,wander:1-a},g.current)},[m,i,c.state]),_.useEffect(()=>{if(p||!h)return;let a=0,O=0,E=0;const V=K=>{a=requestAnimationFrame(V);const b=O?Math.min((K-O)/1e3,.064):0;O=K,g.current+=b,E+=b*1e3,!(E<Ye)&&(E=0,C(m.sample(g.current)))};return a=requestAnimationFrame(V),()=>cancelAnimationFrame(a)},[m,p,h]);const v=a=>{const E={fill:a.color??(a.depth===void 0?k:re(M,k,a.depth)),opacity:a.opacity};return a.d?{...E,d:a.d,transform:`translate(${a.x} ${a.y}) rotate(${a.rot??0}) scale(${Dt})`}:{...E,cx:a.x,cy:a.y,r:a.r}},R=d.dots.map((a,O)=>{const E=v(a);return a.d?I.jsx("path",{...E},O):I.jsx("circle",{...E},O)});return I.jsxs("svg",{"aria-hidden":"true",className:`bot-animated ${n}`,width:s,height:s,viewBox:`${-B} ${-B} ${B*2} ${B*2}`,children:[I.jsxs("defs",{children:[I.jsxs("mask",{id:P,maskUnits:"userSpaceOnUse",x:-B,y:-B,width:B*2,height:B*2,children:[I.jsx("path",{d:d.bodyPath,fill:"#fff"}),d.eyes.map((a,O)=>I.jsx("path",{d:a.d,transform:a.matrix,opacity:a.alpha,fill:"#000"},O)),d.notch?I.jsx("circle",{cx:d.notch.x,cy:d.notch.y,r:d.notch.r,fill:"#000"}):null]}),d.arcs.map(a=>I.jsx("linearGradient",{id:`${w}-${a.id}`,gradientUnits:"userSpaceOnUse",x1:a.grad.x1,y1:a.grad.y1,x2:a.grad.x2,y2:a.grad.y2,children:a.grad.stops.map((O,E)=>I.jsx("stop",{offset:E/(a.grad.stops.length-1),stopColor:O},E))},a.id))]}),I.jsx("g",{fill:"none",strokeLinecap:"round",children:d.arcs.map(a=>I.jsx("path",{d:a.back,stroke:`url(#${w}-${a.id})`,strokeWidth:a.width,opacity:a.opacity},a.id))}),d.dotsBehind?I.jsx("g",{children:R}):null,I.jsxs("g",{opacity:d.bodyAlpha,children:[I.jsx("path",{d:d.bodyPath,fill:M}),I.jsx("g",{mask:`url(#${P})`,children:I.jsx("rect",{x:-B,y:-B,width:B*2,height:B*2,fill:k})})]}),d.dotsBehind?null:I.jsx("g",{children:R}),d.notif?I.jsx("circle",{cx:d.notif.x,cy:d.notif.y,r:d.notif.r,fill:de}):null,I.jsx("g",{fill:"none",strokeLinecap:"round",children:d.arcs.map(a=>I.jsx("path",{d:a.front,stroke:`url(#${w}-${a.id})`,strokeWidth:a.width,opacity:a.opacity},`f${a.id}`))})]})}export{Ke as BotAnimated};
|
|
1
|
+
import{r as _,j as I}from"./__vite-browser-external-2g_4s3ot.js";import{r as Wt,c as Zt,d as mt,e as Jt}from"./use-pet-settings-CPZdlq_e.js";import{T as j,r as $,c as u,a as et,l as H,b as y,d as U,s as rt,e as T,p as Yt,h as pt,f as te,S as ee,t as at,g as jt,i as se,j as ne,k as ie,C as oe,m as xt,n as re}from"./skins-Mc0sI20C.js";function nt(t,e=.55,s=.62){const n=(t%360+360)%360,i=(1-Math.abs(2*s-1))*e,r=i*(1-Math.abs(n/60%2-1)),o=s-i/2,[l,c,p]=n<60?[i,r,0]:n<120?[r,i,0]:n<180?[0,i,r]:n<240?[0,r,i]:n<300?[r,0,i]:[i,0,r],h=f=>Math.round((f+o)*255).toString(16).padStart(2,"0");return`#${h(l)}${h(c)}${h(p)}`}function ae(t,e,s,n,i=1){const r=t.phase+e*t.speed*j,o=Math.cos(t.tilt),l=Math.sin(t.tilt),c=Math.sqrt(Math.max(0,1-t.k*t.k)),p=64,h=t.sweep*j;let f="",M="",k=null;for(let P=0;P<=p;P++){const x=r+P/p*h,m=Math.cos(x),g=Math.sin(x),d=t.a*(m*o+g*-l*t.k)+t.cx,C=t.a*(m*l+g*o*t.k)+t.cy,R=t.a*g*c<0,a=$(d*s),O=$(C*s),E=R!==k?"M":"L";R?M+=`${E}${a} ${O}`:f+=`${E}${a} ${O}`,k=R}const A=Math.cos(t.tilt)*t.a*s,w=Math.sin(t.tilt)*t.a*s;return{id:n,front:f,back:M,width:t.width*s,opacity:i,grad:{x1:$(t.cx*s-A),y1:$(t.cy*s-w),x2:$(t.cx*s+A),y2:$(t.cy*s+w),stops:[nt(t.hue),nt(t.hue+t.hueSpan*.5),nt(t.hue+t.hueSpan)]}}}const D=et(659918),gt=Array.from({length:6},(t,e)=>({a:1.3+D()*.1,k:.05+D()*.4,tilt:e/6*Math.PI+D()*.5,speed:3+D()*.7,phase:D()*j,sweep:.6+D()*.25,hue:e*360/6+D()*30,hueSpan:60+D()*60,width:.05+D()*.012,cx:0,cy:.1})),ce=Array.from({length:4},(t,e)=>({a:.78+e*.2,k:.05+e*.02,tilt:-.62+e*.05,speed:.3,phase:.06*e,sweep:.4,hue:95+e*62,hueSpan:100,width:.05,cx:0,cy:-.12})),Mt=[-.557,-.013,.532],bt=.165,At=1.25,wt=et(48879),le=Array.from({length:5},(t,e)=>({birth:e*.2,angle:wt()*j,rho:.58+wt()*.18}));function he(t,e){const s=[];for(const n of le){const i=t-n.birth;if(i<0||i>.62)continue;const r=n.rho*Math.pow(.75,i*10),o=n.angle+i*100*Math.PI/180;s.push({x:Math.cos(o)*r*e,y:Math.sin(o)*r*e,r:(.04+.028*u(i/.55))*e,depth:u(1-r/.8),opacity:u(i/.06)*u((.62-i)/.08)})}return s}const kt=et(49383),pe=Array.from({length:4},(t,e)=>{const s=e-1.5;return{a:.85*(1+s*.03),k:.15/.85*(1+s*.16),tilt:34*Math.PI/180+s*.035,speed:210/360,phase:-e*.045+kt()*.012,sweep:.34,hue:e*85+kt()*20,hueSpan:80,width:.095,cx:0,cy:0}}),ue=.129,de="#2496e8",fe=-42,It=1.003,ye=.15,me=1.14,xe=.054,ut=15.46,ct=.186,lt=.412,st={yaw:28.49,pitch:28.62,roll:-13},J=t=>t*Math.PI/180;function tt(t,e,s){const n=Math.cos(s),i=Math.sin(s);return[[t[0]*n+e[0]*i,t[1]*n+e[1]*i,t[2]*n+e[2]*i],[e[0]*n-t[0]*i,e[1]*n-t[1]*i,e[2]*n-t[2]*i]]}function Ht(t,e,s=ut){let n=[0,0,1],i=[1,0,0],r=[0,1,0];[n,i]=tt(n,i,J(t.yaw)),[r,n]=tt(r,n,J(t.pitch)),[i,r]=tt(i,r,J(t.roll));const o=l=>{const[c,p]=tt(n,i,J(s*l));return{x:c[0]*e,y:c[1]*e,a:p[0],b:p[1],c:r[0],d:r[1],depth:c[2]}};return[o(-1),o(1)]}const Pt=et(24301),Et=(()=>{const t=[];let e=1.4;for(;e<900;)t.push(e),e+=1.9+Pt()*2.7,Pt()<.18&&(t.push(e),e+=.24);return t})(),ge=.18;function Me(t){for(let e=0;e<Et.length;e++){const s=Et[e];if(t<s)break;const n=(t-s)/ge;if(n>=0&&n<=1)return n<.45?1-n/.45:(n-.45)/.55}return 1}function be(t,e={}){const{wander:s=1,blink:n=!0,float:i=!0}=e;return{dYaw:(H(t,11.3,.4)*5.5+H(t,3.7,2.1)*1.6)*s,dPitch:(H(t,9.1,1.3)*4.2+H(t,4.3,.7)*1.3)*s,dRoll:H(t,13.7,3.2)*2.2*s,lid:n?Me(t):1,driftX:i?H(t,7.9,1.9)*.006:0,driftY:i?H(t,5.3,.3)*.007:0,breath:i?1+Math.sin(t/3.4*Math.PI*2)*.005:1}}function Ae(t){return .06+.94*u(t)}const L=(t,e,s=0,n=1)=>({w:t,h:e,tilt:s,open:n}),F=(t,e,s=0,n=1)=>[L(t,e,s,n),L(t,e,-s,n)],Xt=[{id:"neutre",gaze:{...st},split:ut,eyes:[L(ct,lt),L(ct,lt)]},{id:"attentif",gaze:{yaw:4,pitch:5,roll:-4},split:16,eyes:F(.21,.44)},{id:"surpris",gaze:{yaw:3,pitch:-3,roll:0},split:19,eyes:F(.45,.47)},{id:"excite",gaze:{yaw:6,pitch:-14,roll:0},split:19.5,eyes:F(.4,.56,-10)},{id:"heureux",gaze:{yaw:5,pitch:9,roll:0},split:17,eyes:F(.27,.17,14)},{id:"hilare",gaze:{yaw:4,pitch:14,roll:0},split:18,eyes:F(.34,.13,20)},{id:"colere",gaze:{yaw:3,pitch:7,roll:0},split:17,eyes:F(.34,.15,30)},{id:"triste",gaze:{yaw:3,pitch:-13,roll:0},split:16,eyes:F(.22,.4,-28)},{id:"effraye",gaze:{yaw:2,pitch:-20,roll:0},split:20.5,eyes:F(.4,.6)},{id:"mefiant",gaze:{yaw:12,pitch:6,roll:-6},split:16,eyes:[L(.21,.4),L(.22,.15)]},{id:"confus",gaze:{yaw:-14,pitch:3,roll:8},split:16.5,eyes:[L(.2,.44,-18),L(.28,.17,14)]},{id:"curieux",gaze:{yaw:16,pitch:-9,roll:-15},split:16.5,eyes:[L(.24,.46,-8),L(.2,.38,-8)]},{id:"fier",gaze:{yaw:5,pitch:17,roll:0},split:17,eyes:F(.3,.15,18)},{id:"timide",gaze:{yaw:-19,pitch:-14,roll:-7},split:14,eyes:F(.17,.3)},{id:"blase",gaze:{yaw:-22,pitch:2,roll:0},split:16,eyes:F(.3,.12)},{id:"somnolent",gaze:{yaw:6,pitch:-9,roll:-3},split:16,eyes:F(.2,.42,0,.42)}],Ot=new Map(Xt.map(t=>[t.id,t])),zt=(t,e,s)=>({w:y(t.w,e.w,s),h:y(t.h,e.h,s),tilt:y(t.tilt??0,e.tilt??0,s),open:y(t.open,e.open,s)});function we(t,e,s){return{id:e.id,gaze:{yaw:y(t.gaze.yaw,e.gaze.yaw,s),pitch:y(t.gaze.pitch,e.gaze.pitch,s),roll:y(t.gaze.roll,e.gaze.roll,s)},split:y(t.split,e.split,s),eyes:[zt(t.eyes[0],e.eyes[0],s),zt(t.eyes[1],e.eyes[1],s)]}}const X=(t,e)=>[{w:t,h:e,open:1},{w:t,h:e,open:1}];function S(t={}){return{sil:U(1),offX:0,offY:0,gaze:{...st},split:ut,eyes:X(ct,lt),eyeAlpha:1,bodyAlpha:1,dots:[],arcs:[],notif:null,dotsBehind:!1,...t}}const Gt=-.1875,ke=Yt(pt(0,-.505,.132,0,.13,.075),0,Gt),Ie=Yt(pt(0,-.2535,.1345,0,.2535,.1345),0,0),Pe=(t={})=>({radii:[...ke],rot:0,cx:0,cy:Gt,sx:1,sy:1,...t}),Ee=(t={})=>({radii:[...Ie],rot:0,cx:0,cy:0,sx:1,sy:1,...t}),Oe=te(pt(0,0,.118,0,.172,.012)),Rt=.213;function _t(t){return rt("triangle",{rot:t,cx:-Rt*Math.sin(t),cy:Rt*Math.cos(t)})}function St(t,e){const s=((t-e*.5)/1.5%1+1)%1,n=s<.5?.5-.5*Math.cos(s*j):0;return u(n*2)}const Ut=[{id:"idle",duration:2.4,morph:.45,blinkIn:!1,baseFace:!0,baseBody:!0,pose:()=>S()},{id:"thinking",duration:2.6,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!0,pose:t=>{const e=St(t,1),s=.3+.7*T.easeOutCubic(u(t/.3));return S({sil:U(bt*(1+(At-1)*e),{cx:Mt[1]}),eyeAlpha:0,dots:[0,2].map(n=>{const i=St(t,n);return{x:Mt[n]*s,y:0,r:bt*(1+(At-1)*i),opacity:.55+.45*i}})})}},{id:"wink",duration:1.6,morph:.3,blinkIn:!0,baseFace:!1,baseBody:!0,pose:()=>S({gaze:{yaw:-5.37,pitch:4.55,roll:6.7},split:16.25,eyes:[{w:.236,h:.464,open:1},{w:.447,h:.089,open:1}]})},{id:"wide",duration:1.8,morph:.55,blinkIn:!0,baseFace:!1,baseBody:!0,pose:()=>S({gaze:{yaw:6.92,pitch:-21.96,roll:11.6},split:18.43,eyes:X(.356,.875)})},{id:"alert",duration:2.4,minDuration:2,morph:.45,baseFace:!1,baseBody:!1,blinkIn:!1,pose:t=>{const e=u(t/1.5),s=T.easeInOutCubic(e)*.82-.087,n=t>1.6?u((t-1.6)/.4):0,i=s*(1-n)+.1*n,r=Math.sin(t*2.5*j)*.005,o=17.7*Math.PI/180;return S({sil:Ee({rot:o,cx:i,cy:-.325-r}),eyeAlpha:0,dots:[{x:i-Math.sin(o)*.58,y:-.325+Math.cos(o)*.58+r*2.8,r:.118,d:Oe,rot:o*180/Math.PI,opacity:1}]})}},{id:"notify",duration:2.2,morph:.5,blinkIn:!0,baseFace:!1,baseBody:!0,pose:t=>{const e=u(t/.45),s=1+(me-1)*Math.sin(e*Math.PI)*(1-e*.35),n=ye*(e<1?s:1),i=fe*Math.PI/180;return S({gaze:{yaw:-21.94,pitch:-5.82,roll:-12.2},split:18.89,eyes:X(.505,.498),notif:{x:Math.cos(i)*It,y:Math.sin(i)*It,r:n,notch:n+xe}})}},{id:"exclaim",duration:2,morph:.45,baseFace:!1,baseBody:!1,blinkIn:!1,pose:()=>S({sil:Pe(),eyeAlpha:0,dots:[{x:-.012,y:.526,r:.113,opacity:1}]})},{id:"sleep",duration:2.4,morph:.5,baseFace:!1,baseBody:!1,blinkIn:!1,pose:t=>S({sil:U(.1585,{cy:.11+Math.sin(t*(j/.6))*.19}),eyeAlpha:0})},{id:"egg",duration:1.8,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!0,pose:()=>S({sil:rt("egg"),gaze:{yaw:19.97,pitch:26.01,roll:-17.1},split:11.07,eyes:X(.164,.385)})},{id:"hexagon",duration:1.6,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!0,pose:()=>S({sil:rt("hexagon"),gaze:{yaw:23.11,pitch:24.42,roll:-13.3},split:13.37,eyes:X(.177,.411)})},{id:"play",duration:2,morph:.5,baseFace:!1,baseBody:!1,blinkIn:!0,pose:t=>{const e=u(t/.35)*u((2.2-t)/.5);return S({sil:_t(0),gaze:{yaw:12,pitch:-8,roll:-6},split:15,eyes:X(.18,.34),arcs:ce.map((s,n)=>({id:`sw${n}`,seed:{...s,cx:.45-t*.42},t,opacity:e}))})}},{id:"orbit",duration:3.4,minDuration:2.5,morph:.6,baseFace:!1,baseBody:!1,blinkIn:!1,pose:t=>{const e=T.easeInOutCubic(u(t/.35)),s=-j*1.25*t*e,n=T.easeInOutCubic(u((t-1.6)/.9)),i=_t(s),r=U(1,{rot:s}),o={radii:i.radii.map((c,p)=>c+(r.radii[p]-c)*n),rot:s,cx:i.cx*(1-n),cy:i.cy*(1-n),sx:1,sy:1},l=u(t/.8)*u((3.6-t)/.9);return S({sil:o,gaze:{yaw:st.yaw+Math.sin(t*6.5)*65*(1-n),pitch:-4+n*32,roll:-13},eyes:X(.18,.34+n*.07),arcs:gt.map((c,p)=>({id:`rg${p}`,seed:c,t,opacity:l*u((t-p*.13)/.3)}))})}},{id:"swirl",duration:1.3,minDuration:1.3,morph:.3,baseFace:!0,baseBody:!0,blinkIn:!0,pose:t=>S({arcs:gt.slice(0,3).map((e,s)=>({id:`sw${s}`,seed:e,t,opacity:u((t-s*.06)/.14)*u((1.22-t)/.34)}))})},{id:"burst",duration:2.6,minDuration:2.4,morph:.4,baseFace:!1,baseBody:!1,blinkIn:!1,pose:t=>{const e=1-.834*T.easeOutQuint(u(t/.7)),s=T.easeOutQuint(u((t-1.7)/.7));return S({sil:U(e+(1-e)*s),eyeAlpha:u((t-1.85)/.4),dots:he(t,1),dotsBehind:!0})}},{id:"comet",duration:2.4,minDuration:2.4,morph:.45,baseFace:!1,baseBody:!1,blinkIn:!1,pose:t=>{const e=1-(1-ue)*T.easeOutQuint(u(t/.55)),s=T.easeOutQuint(u((t-1.85)/.6)),n=u((t-.15)/.25)*u((1.95-t)/.3);return S({sil:U(e+(1-e)*s,{cy:Math.sin(u(t/1.7)*Math.PI)*.035}),eyeAlpha:u((t-2)/.35),arcs:pe.map((i,r)=>({id:`cm${r}`,seed:i,t,opacity:n}))})}}],Q=new Map(Ut.map(t=>[t.id,t])),Y=100,Tt=5.5+1.6,vt=4.2+1.3,ze=.006,Re=.007;function Ft(t,e,s){const n=[],i=Ht(t.gaze,Y,t.split);for(let r=0;r<2;r++){const o=i[r];if(o.depth<=.02)continue;const l=t.eyes[r],c=(l.tilt??0)*Math.PI/180,p=Math.cos(c),h=Math.sin(c),f=o.a*p+o.c*h,M=o.b*p+o.d*h,k=-o.a*h+o.c*p,A=-o.b*h+o.d*p,w=Math.max(l.w*Y,.01)/2,P=Math.max(l.h*Y,.01)/2,x=Math.min(w,P),m=P>w,g=m?P-x:w-x,d=jt(s,Math.atan2(o.y,o.x)-e.rot);n.push({x:o.x*d,y:o.y*d,ax:(m?k:f)*g,ay:(m?A:M)*g,r:x,m:[f,M,k,A]})}return n}function _e(t,e,s,n,i){const r=n-e,o=i-s,l=r*r+o*o;let c=1/0,p=0,h=0;for(let M=0;M<t.length;M++){const k=t[M];let A=l>0?((k.x-e)*r+(k.y-s)*o)/l:0;A=A<0?0:A>1?1:A;const w=e+A*r-k.x,P=s+A*o-k.y,x=w*w+P*P;x<c&&(c=x,p=w,h=P)}const f=Math.sqrt(c);return{d:f,ux:f>1e-9?p/f:0,uy:f>1e-9?h/f:0}}const Se=Math.hypot(ze,Re)*Y;function Bt(t,e,s,n){let i=1/0,r=0,o=0;for(const l of e){const c=l.x+s,p=l.y+n,h=_e(t,c-l.ax,p-l.ay,c+l.ax,p+l.ay),[f,M,k,A]=l.m,w=l.r*Math.hypot(f*h.ux+M*h.uy,k*h.ux+A*h.uy)+Se;h.d-w<i&&(i=h.d-w,r=h.ux,o=h.uy)}return{marge:i,ux:r,uy:o}}const $t=12,Te=8;function ve(t){if(!t.length)return{x:0,y:0};const e=(x,m)=>{let g=1/0;for(const d of t)g=Math.min(g,Bt(d.contour,d.empreintes,x,m).marge);return g};let s=1/0;for(const x of t)s=Math.min(s,Bt(x.calContour,x.reference,0,0).marge);let n=0,i=0;const r=t[0].empreintes;for(const x of r)n-=x.x/r.length,i-=x.y/r.length;const o=Math.max(.35*Y,Math.hypot(n,i)*1.25);s=Math.min(s,e(n,i));const l=e(0,0);if(l>=s&&l>=0)return{x:0,y:0};const c=Math.max(s,0);let p=0,h=0,f=1/0,M=0,k=0,A=l;for(let x=0;x<$t;x++){const m=x/$t*Math.PI*2,g=Math.cos(m),d=Math.sin(m);if(e(g*o,d*o)<c){for(const R of[.3,.6,1]){const a=e(g*o*R,d*o*R);a>A&&(A=a,M=g*o*R,k=d*o*R)}continue}let C=0,v=o;for(let R=0;R<Te;R++){const a=(C+v)/2;e(g*a,d*a)>=c?v=a:C=a}v<f&&(f=v,p=g*v,h=d*v)}const w=f===1/0?M:p,P=f===1/0?k:h;return{x:+(w/Y).toFixed(6),y:+(P/Y).toFixed(6)}}function Fe(t,e,s){return t.baseFace&&s?{gaze:s.gaze,split:s.split,eyes:s.eyes}:{gaze:e.gaze,split:e.split,eyes:e.eyes}}function Be(t){const e=n=>JSON.stringify([n.gaze,n.split,n.eyes,n.sil.rot,n.sil.cx,n.sil.cy,n.sil.sx,n.sil.sy]);if(e(t.pose(0))===e(t.pose(t.duration)))return[0];const s=3;return Array.from({length:s},(n,i)=>i/(s-1)*t.duration)}function $e(t,e,s){const n=[];for(const i of Be(t)){const r=t.pose(i),o=at({...r.sil,radii:e},Y),l=at(r.sil,Y),c=Fe(t,r,s),p=[];for(const h of[-Tt,Tt])for(const f of[-vt,vt])p.push({...c,gaze:{yaw:c.gaze.yaw+h,pitch:c.gaze.pitch+f,roll:c.gaze.roll}});for(const h of p)n.push({empreintes:Ft(h,r.sil,e),reference:Ft(h,r.sil,r.sil.radii),contour:o,calContour:l})}return ve(n)}const it={x:0,y:0},ht=(t,e)=>`${t}|${e??""}`;function Ce(){return new Map(ee.map(t=>{const e=new Map;for(const s of Ut){if(!s.baseBody)continue;const n=s.baseFace?[null,...Xt]:[null];for(const i of n)e.set(ht(s.id,i?.id??null),$e(s,t.radii,i))}return[t.radii,e]}))}const Le=Ce();function Ct(t,e,s){if(!t)return it;const n=Le.get(t);return n?n.get(ht(e,s))??n.get(ht(e,null))??it:it}const ot={yaw:0,pitch:0,mix:0,spin:0,wander:1},Ne=(t,e,s)=>({yaw:y(t.yaw,e.yaw,s),pitch:y(t.pitch,e.pitch,s),mix:y(t.mix,e.mix,s),spin:y(t.spin,e.spin,s),wander:y(t.wander,e.wander,s)}),Lt=(t,e,s)=>({w:y(t.w,e.w,s),h:y(t.h,e.h,s),open:y(t.open,e.open,s),tilt:y(t.tilt??0,e.tilt??0,s)});function Nt(t,e,s){const n=1-s;return{sil:ie(t.sil,e.sil,s),offX:y(t.offX,e.offX,s),offY:y(t.offY,e.offY,s),gaze:{yaw:y(t.gaze.yaw,e.gaze.yaw,s),pitch:y(t.gaze.pitch,e.gaze.pitch,s),roll:y(t.gaze.roll,e.gaze.roll,s)},split:y(t.split,e.split,s),eyes:[Lt(t.eyes[0],e.eyes[0],s),Lt(t.eyes[1],e.eyes[1],s)],eyeAlpha:y(t.eyeAlpha,e.eyeAlpha,s),bodyAlpha:y(t.bodyAlpha,e.bodyAlpha,s),dots:[...t.dots.map(i=>({...i,opacity:i.opacity*n})),...e.dots.map(i=>({...i,opacity:i.opacity*s}))],arcs:[...t.arcs.map(i=>({...i,id:`a${i.id}`,opacity:i.opacity*n})),...e.arcs.map(i=>({...i,id:`b${i.id}`,opacity:i.opacity*s}))],notif:s<.5?t.notif:e.notif,dotsBehind:s<.5?t.dotsBehind:e.dotsBehind}}class G{scale;cur;prev=null;departFige=null;tCur=0;tPrev=0;blinkAt=-10;pts=[];shape=null;shapePrev=null;shapeAt=-10;expr=null;exprPrev=null;exprAt=-10;look=ot;lookPrev=ot;lookAt=-10;lookMorph=.24;static SHAPE_MORPH=.45;static LOOK_MORPH=.24;constructor(e=100,s="idle",n=null,i=null){this.scale=e,this.cur=s,this.shape=n,this.expr=i}setExpression(e,s=0){e!==this.expr&&(this.exprPrev=this.expr,this.expr=e,this.exprAt=s)}exprAtTime(e){const s=this.expr,n=this.exprPrev;if(!s||!n)return s;const i=(e-this.exprAt)/G.SHAPE_MORPH;return i>=1?s:we(n,s,T.easeOutQuint(u(i)))}setShape(e,s=0){e!==this.shape&&(this.shapePrev=this.shape,this.shape=e,this.shapeAt=s)}shapeAtTime(e){const s=this.shape,n=this.shapePrev;if(!s||!n)return s;const i=(e-this.shapeAt)/G.SHAPE_MORPH;if(i>=1)return s;const r=T.easeOutQuint(u(i));return s.map((o,l)=>y(n[l]??o,o,r))}setLook(e,s,n=G.LOOK_MORPH){e&&!Number.isFinite(e.yaw+e.pitch+e.mix+e.spin+e.wander)||(this.lookPrev=this.lookAtTime(s),this.look=e??ot,this.lookAt=s,this.lookMorph=n)}lookAtTime(e){const s=(e-this.lookAt)/this.lookMorph;return s>=1?this.look:Ne(this.lookPrev,this.look,T.easeOutQuint(u(s)))}posed(e,s,n,i){let r=e.pose(s);return e.baseBody&&n&&(r={...r,sil:{...r.sil,radii:n}}),e.baseFace&&i&&(r={...r,gaze:i.gaze,split:i.split,eyes:i.eyes}),r}decalageAtTime(e,s){const n=(r,o,l,c)=>{if(l===c)return c;const p=(e-r)/o;if(p>=1)return c;const h=T.easeOutQuint(u(p));return{x:y(l.x,c.x,h),y:y(l.y,c.y,h)}},i=r=>n(this.exprAt,G.SHAPE_MORPH,Ct(r,s,this.exprPrev?.id??null),Ct(r,s,this.expr?.id??null));return n(this.shapeAt,G.SHAPE_MORPH,i(this.shapePrev),i(this.shape))}get state(){return this.cur}reset(e,s){this.cur=e,this.prev=null,this.departFige=null,this.tCur=s,this.tPrev=s,this.blinkAt=-10}origine(e,s,n){if(this.departFige)return this.departFige;if(!this.prev)return null;const i=Q.get(this.prev);return this.posed(i,Math.max(0,e-this.tPrev),s,n)}poseComposee(e){const s=Q.get(this.cur),n=this.shapeAtTime(e),i=this.exprAtTime(e),r=this.posed(s,Math.max(0,e-this.tCur),n,i),o=e-this.tCur;if(o>=s.morph)return r;const l=this.origine(e,n,i);return l?Nt(l,r,T.easeOutQuint(u(o/s.morph))):r}setState(e,s){if(e===this.cur)return;const n=Q.get(this.cur).morph,i=this.prev!==null&&s-this.tCur<n;this.departFige=i?this.poseComposee(s):null,this.prev=this.cur,this.tPrev=this.tCur,this.cur=e,this.tCur=s,Q.get(e)?.blinkIn&&(this.blinkAt=s)}sample(e){const s=this.scale,n=Q.get(this.cur),i=this.shapeAtTime(e),r=this.exprAtTime(e);let o=this.posed(n,Math.max(0,e-this.tCur),i,r),l=this.decalageAtTime(e,this.cur);const c=e-this.tCur,p=c<n.morph?this.origine(e,i,r):null;if(p){const b=T.easeOutQuint(u(c/n.morph));o=Nt(p,o,b);const N=this.prev;if(N){const z=this.decalageAtTime(e,N);l={x:y(z.x,l.x,b),y:y(z.y,l.y,b)}}}const h=o.eyeAlpha>.01,f=this.lookAtTime(e),M=be(e,{wander:h?f.wander:0,blink:h}),k={yaw:y(o.gaze.yaw,f.yaw,f.mix)+M.dYaw-f.spin,pitch:y(o.gaze.pitch,f.pitch,f.mix)+M.dPitch,roll:o.gaze.roll+M.dRoll},A=u((e-this.blinkAt)/.2),w=A<1?Math.abs(A*2-1):1,P=Math.min(M.lid,w),x=o.offX+M.driftX,m=o.offY+M.driftY,g={...o.sil,cx:o.sil.cx+x,cy:o.sil.cy+m,sy:o.sil.sy*M.breath},d=se(at(g,s,this.pts)),C=(b,N)=>jt(o.sil.radii,Math.atan2(N,b)-o.sil.rot),v=[];if(o.eyeAlpha>.01){const b=Ht(k,s,o.split);for(let N=0;N<2;N++){const z=b[N];if(z.depth<=.02)continue;const q=o.eyes[N],dt=C(z.x,z.y),ft=(q.tilt??0)*Math.PI/180,W=Math.cos(ft),Z=Math.sin(ft),Qt=z.a*W+z.c*Z,Vt=z.b*W+z.d*Z,Kt=-z.a*Z+z.c*W,qt=-z.b*Z+z.d*W,yt=Ae(Math.min(P,q.open));v.push({d:ne(q.w*s,q.h*s),matrix:`matrix(${$(Qt)},${$(Vt*yt)},${$(Kt)},${$(qt*yt)},${$(z.x*dt+(x+l.x)*s)},${$(z.y*dt+(m+l.y)*s)})`,alpha:o.eyeAlpha*u(z.depth/.12)})}}const R=o.dots.filter(b=>b.opacity>.01&&b.r>5e-4).map(b=>({...b,x:(b.x+x)*s,y:(b.y+m)*s,r:b.r*s})),a=o.notif?C(o.notif.x,o.notif.y):1,O=o.notif?(o.notif.x*a+x)*s:0,E=o.notif?(o.notif.y*a+m)*s:0,V=o.notif?{x:O,y:E,r:o.notif.r*s}:null,K=o.notif?{x:O,y:E,r:o.notif.notch*s}:null;return{bodyPath:d,bodyAlpha:o.bodyAlpha,eyes:v,dots:R,dotsBehind:o.dotsBehind,arcs:o.arcs.filter(b=>b.opacity>.01).map(b=>ae(b.seed,b.t,s,b.id,b.opacity)),notif:V,notch:K}}}const Dt=100,De=158,B=De,Ye=1e3/30,je=34;function He(){const[t,e]=_.useState(()=>typeof document>"u"?!1:document.documentElement.classList.contains("dark"));return _.useEffect(()=>{if(typeof MutationObserver!="function")return;const s=document.documentElement,n=new MutationObserver(()=>e(s.classList.contains("dark")));return n.observe(s,{attributes:!0,attributeFilter:["class"]}),()=>n.disconnect()},[]),t}function Xe(){const[t,e]=_.useState(()=>typeof document>"u"?!0:document.visibilityState!=="hidden");return _.useEffect(()=>{if(typeof document>"u")return;const s=()=>e(document.visibilityState!=="hidden");return document.addEventListener("visibilitychange",s),()=>document.removeEventListener("visibilitychange",s)},[]),t}function Ge(){const[t,e]=_.useState(()=>typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches);return _.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const s=window.matchMedia("(prefers-reduced-motion: reduce)"),n=i=>e(i.matches);return s.addEventListener("change",n),()=>s.removeEventListener("change",n)},[]),t}function Ke({state:t="idle-living",dragState:e=null,size:s=48,className:n="",leanX:i=0,shape:r=Zt,color:o="auto",paper:l=null}){const c=Jt(e==="running-left"||e==="running-right"?e:t),p=Ge(),h=Xe(),f=He(),M=l||(f?mt.dark:mt.light),k=oe.get(Wt(o,f)).hex,A=_.useId(),w=_.useMemo(()=>A.replace(/[^a-zA-Z0-9_-]/g,""),[A]),P=`bot-mask-${w}`,x=_.useRef(null);x.current===null&&(x.current=new G(Dt,c.state,xt.get(r)?.radii??null,Ot.get(c.expression)??null));const m=x.current,g=_.useRef(0),[d,C]=_.useState(()=>m.sample(0));_.useEffect(()=>{m.setShape(xt.get(r)?.radii??null,g.current)},[m,r]),_.useEffect(()=>{m.setExpression(Ot.get(c.expression)??null,g.current)},[m,c.expression]),_.useEffect(()=>{m.state!==c.state&&(m.setState(c.state,g.current),C(m.sample(g.current)))},[m,c.state]),_.useEffect(()=>{const a=Math.min(1,Math.abs(i));if(a<=0||!Q.get(c.state)?.baseFace){m.setLook(null,g.current);return}m.setLook({yaw:i*je,pitch:st.pitch,mix:a,spin:0,wander:1-a},g.current)},[m,i,c.state]),_.useEffect(()=>{if(p||!h)return;let a=0,O=0,E=0;const V=K=>{a=requestAnimationFrame(V);const b=O?Math.min((K-O)/1e3,.064):0;O=K,g.current+=b,E+=b*1e3,!(E<Ye)&&(E=0,C(m.sample(g.current)))};return a=requestAnimationFrame(V),()=>cancelAnimationFrame(a)},[m,p,h]);const v=a=>{const E={fill:a.color??(a.depth===void 0?k:re(M,k,a.depth)),opacity:a.opacity};return a.d?{...E,d:a.d,transform:`translate(${a.x} ${a.y}) rotate(${a.rot??0}) scale(${Dt})`}:{...E,cx:a.x,cy:a.y,r:a.r}},R=d.dots.map((a,O)=>{const E=v(a);return a.d?I.jsx("path",{...E},O):I.jsx("circle",{...E},O)});return I.jsxs("svg",{"aria-hidden":"true",className:`bot-animated ${n}`,width:s,height:s,viewBox:`${-B} ${-B} ${B*2} ${B*2}`,children:[I.jsxs("defs",{children:[I.jsxs("mask",{id:P,maskUnits:"userSpaceOnUse",x:-B,y:-B,width:B*2,height:B*2,children:[I.jsx("path",{d:d.bodyPath,fill:"#fff"}),d.eyes.map((a,O)=>I.jsx("path",{d:a.d,transform:a.matrix,opacity:a.alpha,fill:"#000"},O)),d.notch?I.jsx("circle",{cx:d.notch.x,cy:d.notch.y,r:d.notch.r,fill:"#000"}):null]}),d.arcs.map(a=>I.jsx("linearGradient",{id:`${w}-${a.id}`,gradientUnits:"userSpaceOnUse",x1:a.grad.x1,y1:a.grad.y1,x2:a.grad.x2,y2:a.grad.y2,children:a.grad.stops.map((O,E)=>I.jsx("stop",{offset:E/(a.grad.stops.length-1),stopColor:O},E))},a.id))]}),I.jsx("g",{fill:"none",strokeLinecap:"round",children:d.arcs.map(a=>I.jsx("path",{d:a.back,stroke:`url(#${w}-${a.id})`,strokeWidth:a.width,opacity:a.opacity},a.id))}),d.dotsBehind?I.jsx("g",{children:R}):null,I.jsxs("g",{opacity:d.bodyAlpha,children:[I.jsx("path",{d:d.bodyPath,fill:M}),I.jsx("g",{mask:`url(#${P})`,children:I.jsx("rect",{x:-B,y:-B,width:B*2,height:B*2,fill:k})})]}),d.dotsBehind?null:I.jsx("g",{children:R}),d.notif?I.jsx("circle",{cx:d.notif.x,cy:d.notif.y,r:d.notif.r,fill:de}):null,I.jsx("g",{fill:"none",strokeLinecap:"round",children:d.arcs.map(a=>I.jsx("path",{d:a.front,stroke:`url(#${w}-${a.id})`,strokeWidth:a.width,opacity:a.opacity},`f${a.id}`))})]})}export{Ke as BotAnimated};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as r,y as t}from"./__vite-browser-external-
|
|
1
|
+
import{j as r,y as t}from"./__vite-browser-external-2g_4s3ot.js";function c({children:i,title:a,subtitle:o,className:s="",bodyClassName:d="",...e}){return r.jsxs("div",{...e,className:t("rounded-xl border border-oai-gray-200 dark:border-oai-gray-800 bg-white dark:bg-oai-gray-900 transition-colors duration-200",s),children:[(a||o)&&r.jsxs("div",{className:"px-5 py-4 border-b border-oai-gray-200 dark:border-oai-gray-800 transition-colors duration-200",children:[a&&r.jsx("h3",{className:"text-sm font-medium text-oai-gray-500 dark:text-oai-gray-300 uppercase tracking-wide transition-colors duration-200",children:a}),o&&r.jsx("p",{className:"text-sm text-oai-gray-500 dark:text-oai-gray-300 mt-1 transition-colors duration-200",children:o})]}),r.jsx("div",{className:`p-5 ${d}`,children:i})]})}export{c as C};
|